我有一个关于下面描述的模型的问题:
经理类拥有工具并与他们做点什么...... 每个工具都有所作为......
每个工具都应该将自己(以静态方法)注册到管理器(管理器可以包含工具的静态字段),因此当管理器启动时应该能够看到所有工具。
这样做的最佳做法是什么?
答案 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容器。
如果您有一个小型或中小型项目,那么我不会让ITool
或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());
这增强了可测试性,松耦合,每个班级都做了它应该做的事情,不再是。