使用静态类和属性的依赖注入

时间:2011-09-14 10:09:09

标签: design-patterns dependency-injection static static-methods static-classes

我设计了一个多层解决方案并创建了一堆 Manager 类来实现业务逻辑。所有经理都来自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 个答案:

答案 0 :(得分:2)

这里有几个选项:

1)

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

这要求您使用

实例化BaseManager
IoCLocator.Resolve<BaseManager>();

或类似的东西,取决于具体的IoCLocator(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,然后从容器中解析它的实例。

希望这会有所帮助,伊利亚

<强>更新

你的概念一团糟。要继承的静态类,IoC Container使用主应用程序类是静态的。我建议你选择其中一个,问题就会消失。

答案 1 :(得分:2)

你是否需要你的经理课程是静态的,还是只是你希望他们成为单身人士?

您是否正在寻找一种具有瞬态依赖关系的单例类?

在这种情况下,我会回答单例管理器类应该依赖于可以根据需要创建存储库实例的工厂。

温莎提供一个类型化的工厂设施,帮助创建这样的工厂: http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx