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