此问题与我之前的帖子有关此处。基本上,我想将DAO注入实体,即

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

}

如果我在DAO中有自定义方法,那么我基本上必须将它们包装在实体对象中。所以,如果我有一个IUserDAO.Register(),那么我必须创建一个User.Register()方法来包装它。

最好是创建一个代理对象,其中DAO中的方法动态分配给User对象。所以我可能会有这样的事情:

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

这意味着我可以将User实体保持为适合通过线路进行数据传输的非常愚蠢的类,但也神奇地给它提供了一堆DAO方法。

虽然这远远超出了我的舒适区域,我想知道我需要做些什么呢?我可以使用Castles动态代理吗? C#编译器也能够处理这个并了解动态添加的方法吗?

如果这是无稽之谈,请随时告诉我。

编辑:

  

在编译时,我们需要以某种方式将DAOProxyService.Create()声明为返回User对象。这可以通过泛型完成。

这不是真的,我想要返回的不是User对象,而是具有动态添加的UserDAO方法的User对象。因为这个类在任何地方都没有定义,编译器不知道该怎么做。

我本质上返回的是一个新对象,如下所示:User:IUserDAO,所以我想我可以根据需要进行转换。但这看起来很混乱。

看起来我正在寻找的类似于:混入

有帮助吗?

解决方案

我最初会说你的要求无法奏效。但通过一些调整,我们或许可以让它发挥作用。

var只是一个编译器功能。当你说。

 var x = GetSomeValue();

编译器说''GetSomeValue'被定义为返回一个字符串,所以程序员必须写'string x = GetSomeValue();'“。请注意,编译器说明了这一点;此更改在编译时完成。

您想要定义一个基本上返回Object的类(DAOProxyService)。这将起作用,但是“var User”将与“对象用户”相同。

在编译时,我们需要以某种方式将DAOProxyService.Create()声明为返回User对象。这可以通过泛型完成:

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

其他提示

它不是完全自动,但您可以考虑使用Oleg Sych的方法来生成装饰器类。每当IUserDAO更改(新方法等)时,只需重新生成文件。比手动维护更好: - )

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top