此问题与我之前的帖子Here有关。基本上,我想将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,所以我想我可以根据需要进行转换。但这看起来很混乱。
看起来我正在寻找的内容与此类似:Mixins
答案 0 :(得分:0)
我最初会说你的要求无法奏效。但通过一些调整,我们或许可以让它发挥作用。
var只是一个编译器功能。当你说。
var x = GetSomeValue();
编译器说“'GetSomeValue'被定义为返回一个字符串,所以程序员必须写'string x = GetSomeValue();'”。请注意,编译器说明了这一点;此更改在编译时完成。
您想要定义一个基本上返回Object的类(DAOProxyService)。这将有效,但“var User”将与“Object user”相同。
在编译时,我们需要以某种方式将DAOProxyService.Create()声明为返回User对象。这可以通过泛型完成:
class DAOProxyService
{
static DAOProxyService<T> Create<T>(T obj) { ......}
}
答案 1 :(得分:0)
它不是完全自动,但您可以考虑使用Oleg Sych的方法来生成装饰器类。每当IUserDAO更改(新方法等)时,只需重新生成文件。比手动维护更好: - )
http://www.olegsych.com/2007/12/how-to-use-t4-to-generate-decorator-classes/