Pergunta

Esta questão está relacionada com um post anterior da mina Aqui . Basicamente, eu quero injetar um DAO em uma entidade ou seja

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

}

Aqui, se eu tivesse um métodos personalizados em meu DAO então eu basicamente tem que envolvê-los no objeto de entidade. Então, se eu tivesse um IUserDAO.Register () Eu teria, então, criar um método User.Register () para envolvê-lo.

O que seria melhor é criar um objeto proxy, onde os métodos do DAO são dinamicamente atribuir ao objeto do usuário. Então eu posso ter algo parecido com isto:

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

Isto significaria que eu possa manter a entidade de usuário como uma classe muito burro adequado para a transferência de dados sobre o fio, mas também magicamente dar-lhe um monte de métodos DAO.

Este é muito fora da minha zona de conforto, porém, e eu me perguntava o que eu precisaria para alcançar este objetivo? Eu poderia usar o proxy Castelos dinâmico? Também o compilador C # ser capaz de lidar com isso e saber sobre os métodos adicionados dinamicamente?

Sinta-se livre para deixar-me saber se isso é um absurdo.

EDIT:

O que precisamos fazê-lo de alguma forma declarar DAOProxyService.Create () como retornando um objeto de usuário - em tempo de compilação. Isso pode ser feito com os genéricos.

Isto não é bem verdade, o que eu quero de retorno não é um objeto Usuário, mas um objeto Usuário com métodos UserDao adicionados dinamicamente. Como essa classe não é defnied qualquer lugar o compilador não vai saber o que fazer com ele.

O que eu sou essencialmente o retorno é um novo objeto que se parece com: User: IUserDAO, então eu acho que eu poderia lançar conforme necessário. Mas isso parece confuso.

Looks como o que eu estou procurando é semelhante a este: Mixins

Foi útil?

Solução

Eu estava inicialmente vai dizer o que você pergunta não pode trabalhar. Mas, com alguns ajustes, que pode ser capaz de fazê-lo funcionar.

var é apenas uma característica do compilador. Quando você diz.

 var x = GetSomeValue();

o compilador diz " 'GetSomeValue' é definido como devolver uma cadeia, por isso a necessidade programador de significado para escrever 'string x = GetSomeValue ();'". Note que o compilador diz isso; esta mudança é feita no compilação tempo.

Você deseja definir uma classe (DAOProxyService) que essencialmente retorna um objeto. Este trabalho, mas "var usuário" seria o mesmo que "user objeto".

O que precisamos fazê-lo de alguma forma declarar DAOProxyService.Create () como retornando um objeto de usuário - em tempo de compilação. Isso pode ser feito com os genéricos:

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

Outras dicas

Não é inteiramente automático, mas você pode considerar usando uma variação do método de Oleg Sych para gerar as classes decoradas. Sempre que IUserDAO muda (novo método, etc) apenas gerar novamente o arquivo. Melhor do que mantê-la manualmente: -)

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top