1

我有一个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但是,使用构造函数依赖注入的实现也有同样的问题。

关于这两种解决方案或其他解决方案的优缺点的任何想法?

4

1 回答 1

0

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

在你的情况下,我会认为ISpec是一家工厂。如果列表不是延迟计算的,则其中没有任何价值。

此外,简单是一个重要的设计原则。由于ISpec没有增加任何功能或架构自由度,因此它没有自己的重量。

于 2013-07-22T23:05:09.760 回答