2008-10-23 70 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) { ......} 
}