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
没有增加任何功能或架构自由,因此它没有自身的份量。谢谢。这很有帮助。我喜欢。