Dependency injection DI和复合组件-设计

Dependency injection DI和复合组件-设计,dependency-injection,law-of-demeter,Dependency Injection,Law Of Demeter,我正在为一个系统设计一个新的组件,试图遵循DI的各种指导原则,这样我们就可以在隔离、模拟等方面获得回报 因此,我有以下组件(作为抽象说明): Fetcher-支持IFetcher,它 从特定数据中获取数据 来源。返回IDataSource 生成器-支持IBuilder,它 从IDataSource构建结构 我想将它们封装在“Performer”(因为缺少更好的名称)组件中,该组件将执行以下操作: IDataSet Performer.Perform(IFetcher fetcher, IBu

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

因此,我有以下组件(作为抽象说明):

  • Fetcher-支持IFetcher,它 从特定数据中获取数据 来源。返回IDataSource
  • 生成器-支持IBuilder,它 从IDataSource构建结构
我想将它们封装在“Performer”(因为缺少更好的名称)组件中,该组件将执行以下操作:

IDataSet Performer.Perform(IFetcher fetcher, IBuilder builder)
{
  IDataSource ds = fetcher.Fetch();
  return builder.BuildDataSet(ds);
}
为了遵守依赖注入和LoD准则(据我所知),我将IFetcher和iBilder组件都传递到了中

我的问题-这听起来像是一个可接受的设计吗?与同事的对话大致是“是的,听起来不错”,但并非100%相信Performer类的封装

在我看来,执行者是一个复合控件,它将两个不同的组件粘合在一起,这应该是可以接受的。唯一的问题是我是否应该有一个“执行者工厂”,但考虑到实际组件(IFetcher和IBuilder)可以被模仿,这似乎有些过分了


如果您有任何想法,我们将不胜感激。

从DI的角度来看,我唯一要改变的是在performer构造函数中获取fetcher和builder。i、 e

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框架就会为您构建它。

谢谢。我的设计稍有改变,因为其他一些东西被曝光,但更广泛的方面仍然存在。