Question

Cette question est liée à un précédent article de mon ici . En gros, je veux injecter un DAO dans une entité, c'est-à-dire

public class User
{
   IUserDAO userDAO;
   public User()
   {
         userDAO = IoCContainer.Resolve<IUserDAO>;
   }
  public User(IUserDAO userDAO)
   {
         this.userDAO = userDAO;
   }
   //Wrapped DAO methods i.e
   public User Save()
   {
       return userDAO.Save(this);
   }

}

Ici, si j'avais des méthodes personnalisées dans mon DAO, je devais les envelopper dans l'objet entité. Donc, si j'avais IUserDAO.Register (), je devrais alors créer une méthode User.Register () pour l'envelopper.

Le mieux serait de créer un objet proxy dans lequel les méthodes de DAO sont attribuées de manière dynamique à l’objet User. Donc, je peux avoir quelque chose qui ressemble à ceci:

var User = DAOProxyService.Create(new User());
User.Save();

Cela signifierait que je peux conserver l'entité User en tant que classe assez stupide adaptée au transfert de données sur le réseau, mais aussi lui donner par magie un tas de méthodes DAO.

C’est pourtant très hors de ma zone de confort et je me suis demandé de quoi aurais-je besoin pour accomplir cela? Puis-je utiliser le proxy dynamique Castles? Le compilateur C # serait-il également capable de gérer cela et de connaître les méthodes ajoutées dynamiquement?

N'hésitez pas à me faire savoir si cela n'a aucun sens.

EDIT:

  

Ce que nous devons faire en quelque sorte, déclarons DAOProxyService.Create () comme renvoyant un objet User - au moment de la compilation. Cela peut être fait avec des génériques.

Ce n'est pas tout à fait vrai, ce que je veux renvoyer n'est pas un objet Utilisateur, mais un objet Utilisateur avec des méthodes UserDAO ajoutées dynamiquement. Comme cette classe n’est définie nulle part, le compilateur ne saura pas quoi en faire.

Ce que je retourne essentiellement, c’est un nouvel objet ressemblant à: Utilisateur: IUserDAO, donc je suppose que je pourrais lancer le casting selon les besoins. Mais cela semble en désordre.

On dirait que ce que je cherche ressemble à ceci: Mixins

Était-ce utile?

La solution

J'allais d'abord dire que ce que vous demandez ne peut pas fonctionner. Mais avec quelques ajustements, nous pourrons peut-être le faire fonctionner.

var est juste une fonctionnalité du compilateur. Quand vous dites.

 var x = GetSomeValue();

le compilateur dit "GetSomeValue" est défini comme renvoyant une chaîne. Le programmeur doit donc avoir l'intention d'écrire "chaîne x = GetSomeValue ();" " ". Notez que le compilateur dit ceci; cette modification est effectuée à compiler .

Vous souhaitez définir une classe (DAOProxyService) qui renvoie essentiellement un objet. Cela fonctionnera, mais "var user". serait identique à "Utilisateur d'objet".

Ce que nous devons faire en quelque sorte, déclarons DAOProxyService.Create () comme renvoyant un objet User - au moment de la compilation. Cela peut être fait avec des génériques:

class DAOProxyService
{
     static DAOProxyService<T> Create<T>(T obj) { ......} 
}

Autres conseils

Ce n'est pas entièrement automatique, mais vous pouvez envisager d'utiliser une variante de la méthode de Oleg Sych pour générer des classes de décorateur. Chaque fois que IUserDAO change (nouvelle méthode, etc.), il suffit de régénérer le fichier. Mieux que de le maintenir manuellement: -)

http: // www.olegsych.com/2007/12/how-to-use-t4-to-generate-decorator-classes/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top