编程模型 - 经理+工具

时间:2013-08-23 17:18:42

标签: c# design-patterns

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

经理类拥有工具并与他们做点什么...... 每个工具都有所作为......

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

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

1 个答案:

答案 0 :(得分:1)

如果我必须这样做,我会采用不同的方式。我会有一个工具界面,类似于ITool,它包含所有工具的共同方法,如DoJob()或任何您认为合适的工具。

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

interface ITool {
    DoJob();
}

class Manager {

    public Manager(IEnumberable<ITool> tools);

    public AddTool(ITool tool);
} 

编辑:虽然我完全不了解您的要求,但我认为我对您要做的事情有所了解。

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

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

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

相反,我会使用一个名为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());

这增强了可测试性,松耦合,每个班级都做了它应该做的事情,不再是。