关于下面描述的模型,我有一个问题:
经理类持有工具并对它们做一些事情..。每个工具都有作用..。
每个工具都应该(在静态方法中)注册到管理器(管理员可以包含静态的工具字段),所以当一个管理器启动时,应该能够看到所有的工具。
做这件事的最佳做法是什么?
发布于 2013-08-23 21:46:50
如果我必须这样做,我会采取不同的做法。我将为工具提供一个接口,类似于ITool
,它包含所有工具(如DoJob()
)或任何您认为合适的方法。
然后,我将设计manager类,以便通过构造函数接受一个ITool
列表,并拥有一个方法,使您能够在设计时添加更多的工具。
interface ITool {
DoJob();
}
class Manager {
public Manager(IEnumberable<ITool> tools);
public AddTool(ITool tool);
}
编辑:虽然我不完全理解您的需求,但是我想我对您想做的事情有一种感觉。
您说过假设ITool
是私有的,或者已经在管理器之前加载了,我不知道这为什么会导致问题,除非实现ITool
的类在不同于程序集Manager
的程序集中是私有的,如果是这样的话,请继续阅读。
如果您的项目是大的或中型的,那么我建议使用MEF或Ninject容器。
如果您有一个小型或中小型项目,那么我不会让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());
这增强了可测试性,松散耦合,并且每个类都完成了它应该做的事情,不再做了。
https://stackoverflow.com/questions/18408386
复制相似问题