【问题标题】:Dependency Injection with Static classes and properties静态类和属性的依赖注入
【发布时间】:2011-11-16 21:24:19
【问题描述】:

我设计了一个多层解决方案并创建了一堆 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 应该在每个管理器类的创建时实例化)。

我有哪些选择来将管理器类定义为静态并且在每次调用管理器的方法时仍然实例化受保护的成员?

【问题讨论】:

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


    【解决方案1】:

    你有几个选择:

    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 容器是静态的。我建议你选择一个,问题就会自行消失。

    【讨论】:

    • 我想我不够清楚。我在这里想要实现的是定义管理器(BaseManagerUserManager)静态并通过使用在每次调用时实例化的 IoC 访问静态存储库变量。
    • 如果你的存储库是静态的?受保护有什么用?
    • 我使用了受保护的,因此存储库成员将对所有子类可见(如UserManager)。每次调用都不应定义存储库。
    • 谢谢。稍微研究了一下,不得不承认,这个概念真的是一团糟,是设计模式的问题。
    【解决方案2】:

    您需要管理器类是静态的,还是只是希望它们是单例的?

    您是否正在寻找一种方法来创建具有临时依赖关系的单例类?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多