方法参数的数据封装考虑(依赖注入)

时间:2013-07-22 21:07:51

标签: c# oop solid-principles

我有spec translator,如下所示。

    //all specifications implement this base class
    public abstract class SpecBase
        {
            public abstract void Translate(IContext context);     
        }

 //spec translator implementation
        public interface ISpecTranslator
        {
            void Translate(IContext context);
        }

我需要注入SpecTranslator构造函数的依赖项。我有两种表达依赖性的方法。

解决方案1 ​​

 public class SpecTranslator:ISpecTranslator
    {
        IList<SpecBase> specs; 

      public SpecTranslator(IList<SpecBase> specs)
        {       
                this.specs = specs;
        }

    }

请注意暂时使用IList<SpecBase>,但似乎解决方案2提供了更多保护。

解决方案2:

 public class SpecTranslator:ISpecTranslator
    {
        ISpec spec;
      public SpecTranslator(ISpec spec)
        {       
                this.spec = spec;
        }

  }

    public interface ISpec
    {
        IList<SpecBase> specs {get;}
    }

但是,使用构造函数依赖注入时ISpec的实现具有相同的问题。

对这两种解决方案或其他解决方案的利弊有何看法?

1 个答案:

答案 0 :(得分:0)

似乎为了“翻译”(分析)规范列表,所有ISpec实例的内容都需要在所有情况下进行解构。必须获得并查看列表。无论你编织多少层抽象,SpecTranslator最终都需要一个列表。

在你的情况下,我认为ISpec是一个工厂。如果列表没有延迟计算,则没有值。

此外,简单是一个重要的设计原则。由于ISpec不会增加任何能力或建筑自由度,因此它不会承担自身的重量。