2015-08-17 3 views
3

J'utilise actuellement une version Client avec AngularJS 1.x dans TypeScript et un Backend AspNet WebApi en C#.Génération TypeLite avec ajout de la dépendance hirarchal

Pour la communication avec le backend j'utilise le $ resource-Service de angular. En utilisant ce service, mes interfaces modèles générés avec TypeLITE doivent étendre

ng.resource.IResource<IModel> 

Est-il possible d'étendre automatiquement toutes les interfaces du modèle généré à partir de cette interface décrite par angulaire?

Sinon, tout doit être fait séparement comme celui-ci

export interface Model extends ng.resource.IResource<Model> { 
} 

Un grand merci à l'avance, MacX

Répondre

1

Ce n'est pas une tâche simple. Une option consiste à créer un TsModelVisitor personnalisé qui ajoute la classe factice ng.resource.IResource<T> au modèle de code et modifie la classe de base pour toutes les autres classes du modèle de code.

je voudrais essayer étapes suivantes:

  • créer une classe qui dérive de TsModelVisitor

    • dans VisitModel méthode créer un nouveau modèle TsClass qui représente l'interface de modèle angulaire
    • dans VisitClass ensemble de méthodes BaseType à la classe créée en VisitModel méthode pour chaque classe
  • appeler votre visiteur de modèle dans le fichier .tt

    var ts = TypeScript.Definitions() 
          .AsConstEnums(false); 
    var model = ts.ModelBuilder.Build(); 
    model.RunVisitor(new YourModelVisitor()); 
    
  • au lieu de <#= ts.Generate(TsGeneratorOutput.Properties) #> utilisation < # = ts.ScriptGenerator.Generate (modèle, TsGeneratorOutput.Properties) #> 'pour générer la sortie

+0

Merci jusqu'à présent. Je vais essayer de l'implémenter de cette façon. Entrera en contact ensuite – MacX

0

La manière la plus simple d'atteindre cet objectif est d'étendre le TsGenerator. Créez un fichier nommé TsAngularJsModelGenerator.ttinclude dans le même répertoire que votre fichier TypeLite.Net4.tt, et coller les éléments suivants:

<#@ assembly name="$(TargetDir)\TypeLite.dll" #> 
<#@ assembly name="$(TargetDir)\TypeLite.Net4.dll"#> 

<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="TypeLite" #> 
<#@ import namespace="TypeLite.TsModels" #> 

<#+ 
class TsAngularJsModelGenerator : TsGenerator 
{ 
    protected override void AppendClassDefinition(TsClass classModel, ScriptBuilder sb, TsGeneratorOutput generatorOutput) 
    { 

     string typeName = this.GetTypeName(classModel); 
     string visibility = this.GetTypeVisibility(classModel, typeName) ? "export " : ""; 
     sb.AppendFormatIndented("{0}interface {1}", visibility, typeName); 
     if (classModel.BaseType != null) 
     { 
      sb.AppendFormat(" extends {0}", this.GetFullyQualifiedTypeName(classModel.BaseType)); 
     } 
     else 
     { 
      sb.AppendFormat(" extends ng.resource.IResource<{0}>", typeName); 
     } 
     sb.AppendLine(" {"); 
     var members = new List<TsProperty>(); 
     if ((generatorOutput & TsGeneratorOutput.Properties) == TsGeneratorOutput.Properties) 
      members.AddRange(classModel.Properties); 
     if ((generatorOutput & TsGeneratorOutput.Fields) == TsGeneratorOutput.Fields) 
      members.AddRange(classModel.Fields); 
     using (sb.IncreaseIndentation()) 
     { 
      foreach (var property in members) 
      { 
       if (property.IsIgnored) 
        continue; 
       var propTypeName = this.GetPropertyType(property); 
       sb.AppendLineIndented(string.Format("{0}: {1};", this.GetPropertyName(property), propTypeName)); 
      } 
     } 
     sb.AppendLineIndented("}"); 
     _generatedClasses.Add(classModel); 
    } 
} #> 

Note: Vous aurez probablement besoin de changer les deux premières lignes pour pointer vers un emplacement valide pour vous (I a constaté que dans le répertoire MVC bin ne contient pas toujours les TypeLite.dll et TypeLite.Net4.dll binaires - si vous avez des difficultés à se rappeler définir la valeur de debug à true dans la première ligne du fichier TypeLite.Net4.tt pour obtenir de meilleurs diagnostics).

Ensuite, ajoutez à votre TypeLite.Net4.tt fichier la ligne suivante sous la ligne <#@include file="Manager.ttinclude"#>:

<#@include file="TsAngularJsModelGenerator.ttinclude"#> 

Enfin, dans le fichier TypeLite.Net4.tt changer l'appel à TypeScript.Definitions, en passant une nouvelle instance de TsAngularJsModelGenerator comme suit:

<# var ts = TypeScript.Definitions(new TsAngularJsModelGenerator()) 
    .WithReference("Enums.ts") 
    .ForLoadedAssemblies(); 
#>