0

我有一个关于下面描述的模型的问题:

经理类持有工具并用它们做一些事情......每个工具都做一些事情......

每个工具都应该(以静态方法)将自己注册到管理器(管理器可以包含工具的静态字段),因此当管理器启动时应该能够看到所有工具。

这样做的最佳做法是什么?

4

1 回答 1

1

如果我必须这样做,我会以不同的方式进行。我会有一个工具接口,比如ITool它包含所有工具通用的方法,DoJob()或者你觉得合适的任何东西。

然后我会设计管理器类,以便通过构造函数接受一个列表ITool,并有一个方法可以让您在设计时添加更多工具。

interface ITool {
    DoJob();
}

class Manager {

    public Manager(IEnumberable<ITool> tools);

    public AddTool(ITool tool);
} 

编辑:虽然我不完全理解你的要求,但我想我对你想要做的事情有感觉。

您说假设ITools 是私有的或已在经理之前加载,我不知道为什么这可能会导致问题,除非实现的类ITool在与程序集不同的程序集中是私有的Manager,如果是这种情况,请继续阅读。

如果您的项目很大或中大型,那么我建议使用 MEF 或 Ninject DI 容器。

如果您有一个小型或中小型项目,那么我不会让ITools 或Manager自行注册它们,因为这违反了单一责任原则。

相反,我会使用一个名为IToolRepository - 一种存储库设计模式 -的接口,让我向您展示:

组装在哪里ITool实施:

interface ITool {
    DoJob();
}

class Hammer : ITool { // impl details }

interface IToolRepository {
    IEnumerable<ITool> GetTools();
}

class ToolsRepository : IToolRepository {
    IEnumerable<ITool> GetTools() {
        // return ITool implementations from this assembly using
        //any method you like, whether from database, web service, or reflection, etc ..
    }
}

static RepositoryFactory {
    IToolRepository CreateRepository() { // returns concrete repository };
}

存在的装配Manager

class Manager {

    public Manager(IToolRepository repository);

    public Manager(IEnumberable<ITool> tools);

    public AddTool(ITool tool);
}

现在,当您想创建一个实例时,Manager您可以从另一个程序集中调用RepositoryFactory.CreateRepository()方法并将结果注入Manager如下:

new Manager(RepositoryFactory.CreateRepository());

这增强了可测试性、松散耦合,并且每个类都做它应该做的事情,仅此而已。

于 2013-08-23T21:46:50.487 回答