10
votes

Générer automatiquement une classe d'emballage en C # à l'aide de la composition

Cela devrait être simple, mais je ne trouve rien là-bas.

J'ai une classe dans un assemblée (une bibliothèque partagée - c'est un ensemble de classes de proxy pour un service Web) J'ai une classe dans un autre assemblage (projet Web)

Il y a une classe appelée "profil" qui est dans l'assembly proxy. Il existe un ensemble de classes qui "utilisent" un profil dans le projet Web. Lorsqu'il n'y a pas d'utilisateur connecté, un génériqueProfile est utilisé.

Suivre le principe de "séparation des préoccupations" .... L'assemblée proxy est utilisée par d'autres projets et concerne uniquement les trucs de service Web. Le projet Web a simplement des trucs Web là-bas

Cependant, il y a maintenant ce besoin de "GenericProfile" - pense à cela comme "utilisateur invité".

La chose logique à faire est de construire une interface appelée iProfile et de faire en tirer les deux classes. Mais cela créerait une dépendance circulaire entre les deux assemblages.

La meilleure idée est de créer une 3ème assemblée appelée myInterfaces et de mettre l'iprofile là-bas - mais cela provoque une violation de la séparation du principe des préoccupations À mon avis. À tout le moins, une instance de ce problème semble trop petite une raison de ressort pour faire un module supplémentaire dans ma solution.

Entrez la classe d'emballage - ou la classe d'emballage composite (tout ce que vous voulez appeler IT)

Je recherche quelque chose qui finit par générer quelque chose comme celui-ci ci-dessous. Y a-t-il une extension d'outil ou de studio visuelle qui le fera? Peut-être un fichier .tt? xxx


3 commentaires

Et il semble que quelqu'un a posé quelque chose de similaire à celui-ci ... Stackoverflow.com/questions/2150416/...


Je n'ai pas de restomé si ...


J'utiliserais T4 pour cela (comme vous le savez aussi bien) mais je ne sais pas s'il y a déjà un modèle complet existant pour cela. Mais je pense qu'un tel gabarit pourrait être écrit assez facilement en utilisant la réflexion.


3 Réponses :


0
votes

Si j'étais confronté à votre problème d'origine, je mets iprofile dans votre bibliothèque partagée, à côté de la classe . Votre projet Web peut ensuite implémenter la classe genericprofile que nécessaire, rien d'autre n'a besoin de savoir à ce sujet, et d'autres clients de la bibliothèque peuvent faire la même chose que nécessaire. Il serait également utile de tester la bibliothèque.


0 commentaires

2
votes

Je ne comprends pas complètement ce que vous essayez d'accomplir, mais ci-dessous, c'est comment je générerais une classe d'emballage avec Restomer.

Personnellement si mon employeur ne veut pas payer pour Resharper, je l'achète. Cela me fait un meilleur développeur. Je suggère fortement que vous envisagez de l'acquérir comme un investissement dans votre carrière. Anti-non-responsabilité - Je ne suis pas du tout connecté avec ou parrainé par Resharper.

  1. Ajoutez l'interface à la classe que vous souhaitez être la classe d'emballage XXX


    1. trouver / cliquer sur "Déléguer la mise en œuvre de" YourInterfaceHere "dans un nouveau champ Mise en œuvre des délégués
      1. Sélectionnez vos options Options déléguées
        1. Cliquez sur Terminer et profitez de votre nouvelle classe XXX


3 commentaires

Visual Studio le fait hors de la boîte. Dans mon expérience, Resharper était excellent au début du siècle, mais la SP a rapidement rattrapé. L'installation de Resharper n'a que des effets secondaires négatifs maintenant. Je comprends que cela est très subjectif et je ne veux pas commencer une guerre. C'est juste mon expérience en tant que développeur de niveau très senior.


ThesoftwareJedi, s'il vous plaît partagez des instructions sur la façon dont vous alliez à ce sujet sans Restomer. Note latérale: J'aime le formatage de Resharper et la façon dont il donne des conseils sur la manière d'utiliser plus efficacement C #.


Si votre classe implémente une interface et possède un champ d'instance ou une propriété, les «actions rapides» incluront une option pour implémenter l'interface «via» votre champ. Voir la réponse que quelqu'un a déjà donné ci-dessous.



5
votes

dans Visual Studio 2017

Créez votre classe P>

namespace WebProject
{
   public interface IProfile
   {...}

   class MyWrapperClass : IProfile
   {
      private IProfile _wrapped;
   }
}


0 commentaires