1

这个问题与我以前的帖子有关。基本上,我想将 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 的方法动态分配给用户对象。所以我可能有这样的东西:

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

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

不过,这远远超出了我的舒适区,我想知道我需要做什么才能做到这一点?我可以使用 Castles 动态代理吗?C# 编译器是否也能够处理这个问题并了解动态添加的方法?

如果这是胡说八道,请随时告诉我。

编辑:

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

这不完全正确,我想要返回的不是 User 对象,而是具有动态添加的 UserDAO 方法的 User 对象。由于此类在任何地方都没有定义,因此编译器将不知道该怎么做。

我本质上返回的是一个新对象,它看起来像:用户:IUserDAO,所以我想我可以根据需要进行转换。但这似乎很混乱。

看起来我正在寻找的是类似于这个:Mixins

4

2 回答 2

0

我最初打算说你问的东西行不通。但是通过一些调整,我们也许可以让它工作。

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

 var x = GetSomeValue();

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

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

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

class DAOProxyService
{
     static DAOProxyService<T> Create<T>(T obj) { ......} 
}
于 2008-10-23T14:41:12.363 回答
0

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

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

于 2008-10-23T15:25:18.717 回答