2012-01-24 54 views
0

有什麼辦法來實現一個通用的工廠,當它返回類需要在構造函數的參數?我所有的工廠是這樣的:是否有可能使用Activator.CreateInstance()的參數創建一個具有構造函數的泛型工廠?

public static class UserServiceFactory 
{ 
    public static UserService GetService() 
    { 
     UserRepository userRepository = new UserRepository(); 
     return new UserService(userRepository); 
    } 

} 

我想是這樣的:

public static TServiceClass GetService<TServiceClass>() 
     where TServiceClass : class, new() 
    { 
     TServiceClass serviceClass = null; 

     string repositoryName = typeof (TServiceClass).ToString().Replace("Service", "Repository"); 
     Type type = Type.GetType(repositoryName); 

     if (type != null) 
     { 
      object repository = Activator.CreateInstance(type); 
      serviceClass = (TServiceClass)Activator.CreateInstance(typeof (TServiceClass), new[]{repository}); 
     } 

     return serviceClass; 
    } 

然而,這當然不會工作,因爲我不能使用無參數的構造函數的類一個通用的參數,但我覺得我很接近。我想到了通過服務類像GetService(Type serviceClassType)但我不能宣佈該方法的返回類型,就必須投它時,我把它稱爲,這是我想避免的。

難道還有其他的方法嗎?這甚至有可能嗎?

+0

@vcsjones你能否詳細闡述你是什麼意思?通常,我使用我的工廠進行DIing(正如您可以看到該服務需要一個存儲庫,而我的工廠負責這一點)。這不再需要每個服務的具體實現嗎?也請在回答部分張貼代表! – SventoryMang

+0

對不起,我誤讀了。 – vcsjones

+0

@vcsjones你是正確的,但刪除new()工作。所以,請在答案部分發帖! – SventoryMang

回答

3

你可以做這樣的事情,並採取兩種類型的參數:

public static TService GetService<TRepository, TService>() where TRepository:new() 
{ 
    var repository = new TRepository(); 
    return (TService)Activator.CreateInstance(typeof(TService), repository); 
} 

或者,如果你想依靠約定,服務和存儲庫是(只是爲了演示)同​​一個名字:

public static TService GetService<TService>() 
{ 
    var repositoryName = String.Concat(typeof(TService).Namespace, Type.Delimiter, typeof(TService).Name.Replace("Service", "Repository")); 
    object repository = Activator.CreateInstance(Type.GetType(repositoryName)); 
    return (TService)Activator.CreateInstance(typeof(TService), repository); 
} 

這種感覺並不明顯,直觀,也許還有更好的,更強大的可用的解決方案。

也許使用inversion of control container會適合作爲一個更好的辦法。

使用的容器,我只想解決UserService而讓容器注入此時,相應的存儲庫。如果UserService是其他依賴項,則讓DI容器解決該問題,而現代容器將解析依賴關係的依賴關係。

+0

謝謝,我確實想到了第一種方法,但是這個約定總是存在的,我希望保持方法調用盡可能簡單。由於當前工廠已經使用鏈接中提到的依賴注入,所以仍然對你的DI容器註釋感到困惑?你可以做一個快速的例子,即使在僞代碼會有幫助嗎? – SventoryMang

相關問題