【问题标题】:DI and Composite Components - DesignDI 和复合组件 - 设计
【发布时间】:2008-12-04 11:49:29
【问题描述】:

我正在为系统设计一个新组件,尝试遵循有关 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),这似乎有点过头了。

任何想法将不胜感激,谢谢。

【问题讨论】:

    标签: dependency-injection law-of-demeter


    【解决方案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 框架就会为您构建它。

    【讨论】:

    • 谢谢。由于其他一些事情的曝光,我的设计略有变化,但它的更广泛的方面仍然存在。
    猜你喜欢
    • 2011-02-20
    • 2011-04-15
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多