Pregunta

Esta pregunta está relacionada con una publicación anterior mía Aquí . Básicamente, quiero inyectar un DAO en una entidad, es decir,

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

}

Aquí, si tuviera métodos personalizados en mi DAO, básicamente tendré que envolverlos en el objeto de entidad. Entonces, si tuviera un IUserDAO.Register () tendría que crear un método User.Register () para envolverlo.

Lo que sería mejor es crear un objeto proxy donde los métodos del DAO se asignan dinámicamente al objeto Usuario. Así que puedo tener algo que se parece a esto:

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

Esto significaría que puedo mantener a la entidad Usuario como una clase bastante tonta adecuada para la transferencia de datos a través del cable, pero también mágicamente darle un montón de métodos DAO.

Sin embargo, esto está muy fuera de mi zona de confort, y me pregunté qué necesitaría para lograrlo. ¿Puedo usar el proxy dinámico de Castles? Además, ¿el compilador de C # podría hacer frente a esto y conocer los métodos agregados dinámicamente?

No dude en hacerme saber si esto es una tontería.

EDITAR:

  

Lo que necesitamos para hacerlo de alguna manera declara que DAOProxyService.Create () devuelve un objeto de Usuario, en tiempo de compilación. Esto se puede hacer con genéricos.

Esto no es del todo cierto, lo que quiero devolver no es un objeto Usuario, sino un objeto Usuario con métodos UserDAO agregados dinámicamente. Como esta clase no se define en ninguna parte, el compilador no sabrá qué hacer con ella.

Lo que esencialmente estoy devolviendo es un nuevo objeto que se parece a: Usuario: IUserDAO, así que supongo que podría lanzar según sea necesario. Pero esto parece desordenado.

Parece que lo que busco es similar a esto: Mixins

¿Fue útil?

Solución

Inicialmente iba a decir que lo que pides no funciona. Pero con algunos ajustes, podríamos lograr que funcione.

var es solo una característica del compilador. Cuando dices.

 var x = GetSomeValue();

el compilador dice que "GetSomeValue" se define como devolver una cadena, por lo que el programador debe escribir "cadena x = GetSomeValue ();" " ;. Tenga en cuenta que el compilador dice esto; este cambio se realiza en compilar a la vez.

Desea definir una clase (DAOProxyService) que esencialmente devuelve un objeto. Esto funcionará, pero " var User " sería lo mismo que " Usuario de objetos " ;.

Lo que necesitamos para hacerlo de alguna manera declara que DAOProxyService.Create () devuelve un objeto de Usuario, en tiempo de compilación. Esto se puede hacer con genéricos:

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

Otros consejos

No es completamente automático, pero podría considerar usar una variación del método de Oleg Sych para generar clases de decoradores. Siempre que IUserDAO cambie (nuevo método, etc.) simplemente regenere el archivo. Mejor que mantenerlo manualmente :-)

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top