1

我設計了一個多層解決方案並創建了一堆管理器類來實現業務邏輯。所有的經理都來自BaseManager類。爲了更清楚,這裏的UserManager類:具有靜態類和屬性的依賴注入

public class UserManager : BaseManager 
{ 
    public void Add(User user) 
    { 
     ... 
    } 
    public void Update(User user) 
    { 
     ... 
    } 
    public void Delete(User user) 
    { 
     ... 
    } 
    public bool GetAccessPermissions(User user) 
    { 
     ... 
    } 
} 

BaseManager如下:

public class BaseManager 
{ 
    protected IRepository repository = IoCLocator.Resolve<IRepository>(); 
    public BaseManager() 
    { 
     ... 
    } 
    // Some shared methods among manager classes. 
} 

現在我懷疑我的管理類都應該定義靜態的,因爲他們得到他們的相關實體上,他們想要操作,作爲參數。但正如你所看到的,我有一些共享的私有/受保護的成員,我應該在每次調用時實例化。 (例如repository應該在每個經理類的創建中實例化)。

我有什麼選擇將管理器類定義爲靜態的,並且每次調用管理器的方法時仍然保護成員實例化?

回答

2

您有幾種選擇在這裏:

1)

public class BaseManager 
    { 
     protected IRepository repository; 
     public BaseManager(IRepository _repository) 
     { 
      repository = _repository 
     } 
     // Some shared methods among manager classes. 
    } 

這需要你來實例化使用

IoCLocator.Resolve<BaseManager>(); 

或類似的東西,這取決於具體的IoCLocator(您BaseManager MEF, Unity,Ninject或你正在使用的任何東西)

2) 幾乎是相同的:

public class BaseManager 
    { 
     protected IRepository repository; 
     public BaseManager(IoCLocator locator) 
     { 
      repository = locator.Resolve<IRepository>(); 
     } 
     // Some shared methods among manager classes. 
    } 

3)或者注入財產直接

public class BaseManager 
{ 
    [InjectFromContainer] 
    protected IRepository repository {get;set;} 

    public BaseManager() 
    { 
     repository = locator.Resolve<IRepository>(); 
    } 
    // Some shared methods among manager classes. 
} 

我叫不出名你需要的屬性,因爲它取決於你的容器上。 無論如何,你必須在BootStrapper中實例化IoC容器,使用它註冊BaseManager,然後從容器中解析它的實例。

希望這有助於伊利亞

UPDATE:

你的概念僅僅是一個爛攤子。要繼承的靜態類,與主應用程序類一起工作的IoC容器是靜態的。我建議你選擇其中的一個,問題會自行消失。

+0

我想我是不太清楚。我想在這裏實現的是定義管理器('BaseManager'和'UserManager')靜態,並通過使用在每次調用中實例化的IoC來訪問靜態庫變量。 – Kamyar

+0

如果您的存儲庫是靜態的?受保護的用途是什麼? –

+0

我使用了保護,因此資源庫成員對所有子類(比如'UserManager')都是可見的。每個呼叫都不應該定義儲存庫。 – Kamyar