首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编程模型- Manager +工具

编程模型- Manager +工具
EN

Stack Overflow用户
提问于 2013-08-23 17:18:41
回答 1查看 157关注 0票数 0

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

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

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

做这件事的最佳做法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-23 21:46:50

如果我必须这样做,我会采取不同的做法。我将为工具提供一个接口,类似于ITool,它包含所有工具(如DoJob() )或任何您认为合适的方法。

然后,我将设计manager类,以便通过构造函数接受一个ITool列表,并拥有一个方法,使您能够在设计时添加更多的工具。

代码语言:javascript
运行
复制
interface ITool {
    DoJob();
}

class Manager {

    public Manager(IEnumberable<ITool> tools);

    public AddTool(ITool tool);
} 

编辑:虽然我不完全理解您的需求,但是我想我对您想做的事情有一种感觉。

您说过假设ITool是私有的,或者已经在管理器之前加载了,我不知道这为什么会导致问题,除非实现ITool的类在不同于程序集Manager的程序集中是私有的,如果是这样的话,请继续阅读。

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

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

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

实现ITool的程序集:

代码语言:javascript
运行
复制
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的程序集:

代码语言:javascript
运行
复制
class Manager {

    public Manager(IToolRepository repository);

    public Manager(IEnumberable<ITool> tools);

    public AddTool(ITool tool);
}

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

代码语言:javascript
运行
复制
new Manager(RepositoryFactory.CreateRepository());

这增强了可测试性,松散耦合,并且每个类都完成了它应该做的事情,不再做了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18408386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档