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,应该在创建每个管理器类时实例化)。

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

4

2 回答 2

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 容器是静态的。我建议您选择其中之一,问题将自行消失。

于 2011-09-14T10:34:42.110 回答
2

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

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

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

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

于 2011-09-14T11:57:26.787 回答