Domanda

Questa domanda è collegata a un mio precedente post Qui . Fondamentalmente, voglio iniettare un DAO in un'entità, ad esempio

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);
   }

}

Qui se avessi un metodo personalizzato nel mio DAO, allora dovrei sostanzialmente avvolgerli nell'oggetto entità. Quindi, se avessi un IUserDAO.Register (), dovrei quindi creare un metodo User.Register () per avvolgerlo.

Ciò che sarebbe meglio è creare un oggetto proxy in cui i metodi del DAO siano assegnati dinamicamente all'oggetto Utente. Quindi potrei avere qualcosa che assomiglia a questo:

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

Ciò significherebbe che posso mantenere l'entità Utente come una classe piuttosto stupida adatta al trasferimento di dati via cavo, ma anche magicamente dargli un sacco di metodi DAO.

Questo è molto fuori dalla mia zona di confort, e mi chiedevo cosa avrei bisogno per raggiungere questo obiettivo? Potrei usare il proxy Castles Dynamic? Inoltre il compilatore C # sarebbe in grado di far fronte a questo e conoscere i metodi aggiunti dinamicamente?

Sentiti libero di farmi sapere se questa è una sciocchezza.

EDIT:

  

Quello che dobbiamo fare in qualche modo dichiarare DAOProxyService.Create () come restituzione di un oggetto Utente - al momento della compilazione. Questo può essere fatto con generici.

Questo non è del tutto vero, ciò che voglio restituire non è un oggetto Utente ma un oggetto Utente con metodi UserDAO aggiunti in modo dinamico. Dato che questa classe non è definita da nessuna parte, il compilatore non saprà cosa farne.

Quello che sto essenzialmente tornando è un nuovo oggetto che assomiglia a: Utente: IUserDAO, quindi credo di poter lanciare come richiesto. Ma questo sembra disordinato.

Sembra che quello che sto cercando sia simile a questo: mixin

È stato utile?

Soluzione

Inizialmente stavo per dire che quello che chiedi non può funzionare. Ma con qualche modifica, potremmo essere in grado di farlo funzionare.

var è solo una funzione del compilatore. Quando dici.

 var x = GetSomeValue();

il compilatore dice " 'GetSomeValue' è definito come la restituzione di una stringa, quindi il programmatore deve necessariamente scrivere 'string x = GetSomeValue ();' " ;. Si noti che il compilatore dice questo; questa modifica viene eseguita al momento compilazione .

Si desidera definire una classe (DAOProxyService) che essenzialmente restituisce un oggetto. Funzionerà, ma "var User" sarebbe uguale a " Oggetto utente " ;.

Quello che dobbiamo fare in qualche modo dichiarare DAOProxyService.Create () come restituzione di un oggetto Utente - al momento della compilazione. Questo può essere fatto con generici:

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

Altri suggerimenti

Non è interamente automatico, ma potresti prendere in considerazione l'uso di una variante del metodo di Oleg Sych per generare classi di decorazione. Ogni volta che IUserDAO cambia (nuovo metodo, ecc.) Rigenera il file. Meglio che mantenerlo manualmente :-)

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top