2008-10-23 67 views
1

这个问题与我以前的帖子Here有关。基本上,我想注入DAO成一个实体,即C#代理和var关键字

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

这意味着,我可以保持用户实体适合于通过线路传输数据的非常愚蠢的班,但也奇迹般地给它一堆DAO方法。

虽然这是我的安慰区,但我想知道我需要做些什么?我可以使用Castles动态代理吗? C#编译器也能够应对这一点并了解动态添加的方法吗?

请随时让我知道这是否是无稽之谈。

编辑:

我们需要做它以某种方式宣布DAOProxyService.Create()为返回用户对象怎么办 - 在编译时。这可以用泛型来完成。

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

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

看起来像什么,我寻找的是与此类似:Mixins

回答

0

我最初去说,你问什么不能工作。但是通过一些调整,我们可能能够实现它的工作。

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

var x = GetSomeValue(); 

编译器说“‘GetSomeValue’被定义为返回一个字符串,所以程序员必须意味着写‘串x = GetSomeValue();’”。请注意,编译器说这个;这个改变是在编译时间完成的。

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

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

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