我有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
的实现具有相同的问题。
对这两种解决方案或其他解决方案的利弊有何看法?
答案 0 :(得分:0)
似乎为了“翻译”(分析)规范列表,所有ISpec
实例的内容都需要在所有情况下进行解构。必须获得并查看列表。无论你编织多少层抽象,SpecTranslator
最终都需要一个列表。
在你的情况下,我认为ISpec
是一个工厂。如果列表没有延迟计算,则没有值。
此外,简单是一个重要的设计原则。由于ISpec
不会增加任何能力或建筑自由度,因此它不会承担自身的重量。