DI和复合材料部件 - 设计

时间:2008-12-04 11:49:29

标签: dependency-injection law-of-demeter

我正在为系统设计一个新组件,试图遵循DI上的各种指导原则,以便在隔离,模拟等方面获得回报。

所以我有以下组件(图示为抽象):

  • Fetcher - 支持IFetcher,其中 从特定数据中获取数据 资源。返回IDataSource。
  • Builder - 支持IBuilder,其中     从IDataSource构建一个结构。

我想将它们包含在'Performer'中(因为缺少更好的名称)组件,它将执行以下操作:

IDataSet Performer.Perform(IFetcher fetcher, IBuilder builder)
{
  IDataSource ds = fetcher.Fetch();
  return builder.BuildDataSet(ds);
}

为了遵守依赖注入和LoD指南(无论如何我都理解它们),我同时传递了IFetcher和IBuilder组件。

我的问题 - 这听起来像是可接受的设计吗?与工作同事的对话是“是的,听起来不错”,但并不是100%相信Performer课程的封装。

我看到它的方式,Performer是一个复合控件,它将几个不同的组件粘合在一起,这应该是可以接受的。唯一的问号是我是否应该有一个'Performer Factory',但这似乎有点过分,因为实际的组件(IFetcher和IBuilder)可以被模拟。

任何想法都会受到赞赏,谢谢。

1 个答案:

答案 0 :(得分:1)

从DI的角度来看,我唯一要改变的是在执行者构造函数中获取fetcher和builder。即。

public class Performer { 

    private IFetcher fetcher; 
    private IBuilder builder;        

    public Performer(IFetcher fetcher, IBuilder builder) {
       this.fetcher = fetcher;
       this.builder = builder;
    }

    public IDataSet Perform(DataSource ds){
       IDataSource ds = fetcher.Fetch();
       return builder.BuildDataSet(ds); 
    }
}

使用DI框架。 不,我认为你不需要工厂方法。只要你需要一个IPerformer就可以调用它,DI框架会为你构建它。