我有一个关于下面描述的模型的问题:
经理类持有工具并用它们做一些事情......每个工具都做一些事情......
每个工具都应该(以静态方法)将自己注册到管理器(管理器可以包含工具的静态字段),因此当管理器启动时应该能够看到所有工具。
这样做的最佳做法是什么?
我有一个关于下面描述的模型的问题:
经理类持有工具并用它们做一些事情......每个工具都做一些事情......
每个工具都应该(以静态方法)将自己注册到管理器(管理器可以包含工具的静态字段),因此当管理器启动时应该能够看到所有工具。
这样做的最佳做法是什么?
如果我必须这样做,我会以不同的方式进行。我会有一个工具接口,比如ITool
它包含所有工具通用的方法,DoJob()
或者你觉得合适的任何东西。
然后我会设计管理器类,以便通过构造函数接受一个列表ITool
,并有一个方法可以让您在设计时添加更多工具。
interface ITool {
DoJob();
}
class Manager {
public Manager(IEnumberable<ITool> tools);
public AddTool(ITool tool);
}
编辑:虽然我不完全理解你的要求,但我想我对你想要做的事情有感觉。
您说假设ITool
s 是私有的或已在经理之前加载,我不知道为什么这可能会导致问题,除非实现的类ITool
在与程序集不同的程序集中是私有的Manager
,如果是这种情况,请继续阅读。
如果您的项目很大或中大型,那么我建议使用 MEF 或 Ninject DI 容器。
如果您有一个小型或中小型项目,那么我不会让ITool
s 或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());
这增强了可测试性、松散耦合,并且每个类都做它应该做的事情,仅此而已。