Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法参数的数据封装考虑(依赖项注入)_C#_Oop_Solid Principles - Fatal编程技术网

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

C# 方法参数的数据封装考虑(依赖项注入),c#,oop,solid-principles,C#,Oop,Solid Principles,我有一个规范转换器,如下所示 //all specifications implement this base class public abstract class SpecBase { public abstract void Translate(IContext context); } //spec translator implementation public interface IS

我有一个
规范转换器
,如下所示

    //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;
        }

    }
公共类频谱转换器:ISpecTranslator
{
IList规范;
公共频谱转发器(ILST规范)
{       
this.specs=规格;
}
}
请注意,使用IList目前可以正常工作,但解决方案2似乎提供了更多的保护

解决方案2:

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

  }

    public interface ISpec
    {
        IList<SpecBase> specs {get;}
    }
公共类频谱转换器:ISpecTranslator
{
ISpec规范;
公共频谱转发器(ISpec规范)
{       
this.spec=spec;
}
}
公共接口ISpec
{
IList规范{get;}
}
然而,当使用构造函数依赖项注入时,
ISpec
的实现也有同样的问题

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

似乎为了“翻译”(分析)规范列表,给定的
ISpec
实例的内容在所有情况下都需要被分解。必须获得一份清单,并将其看穿。无论您编织了多少抽象层,
SpecTranslator
最终都需要一个列表

在你的情况下,我认为ISpec是一家工厂。如果列表不是惰性计算的,则列表中没有值


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

谢谢。这很有帮助。我喜欢。