【发布时间】:2018-12-17 12:42:07
【问题描述】:
在我的应用程序中,我想使用我的 DI 容器 Simple Injector 构建以下对象图:
new Mode1(
new CommonBuilder(
new Grouping(
new GroupingStrategy1())), // NOTE: Strategy 1
new CustomBuilder());
new Mode2(
new CommonBuilder(
new Grouping(
new GroupingStrategy2())), // NOTE: Strategy 2
new CustomBuilder());
以下类代表上图:
public class Mode1 : IMode
{
private readonly ICommonBuilder commonBuilder;
private readonly ICustomBuilder customBuilder;
public Mode1(ICommonBuilder commonBuilder, ICustomBuilder ICustomBuilder customBuilder)
{
this.commonBuilder = commonBuilder;
this.customBuilder = customBuilder;
}
public void Run()
{
this.commonBuilder.Build();
this.customBuilder.Build();
//some code specific to Mode1
}
}
public class Mode2 : IMode
{
//same code as in Mode1
public void Run()
{
this.commonBuilder.Build();
this.customBuilder.Build();
//some code specific to Mode2
}
}
CommonBuilder 和 Grouping 是:
public class CommonBuilder : ICommonBuilder
{
private readonly IGrouping grouping;
public CommonBuilder(IGrouping grouping)
{
this.grouping = grouping;
}
public void Build()
{
this.grouping.Group();
}
}
public class Grouping : IGrouping
{
//Grouping strategy should be binded based on mode it is running
private readonly IGroupingStrategy groupingStrategy;
public Grouping(IGroupingStrategy groupingStrategy)
{
this.groupingStrategy = groupingStrategy;
}
public void Group()
{
this.groupingStrategy.Execute();
}
}
我在我的项目中使用 Simple Injector for DI。如上所示,我采用了 2 种代码模式,根据用户偏好调用,每种模式都有通用代码(我不想复制),我想绑定我的分组策略(I'我根据执行模式在我的通用代码中采用了 2 种分组策略,每种模式一个)。我遇到了使用工厂并在运行时在绑定之间切换的解决方案,但我不想使用该解决方案,因为我在代码中的多个位置都有相同的场景(我最终会创建多个工厂)。
谁能建议如何以更简洁的方式进行绑定
【问题讨论】:
-
您可能正在寻找的概念是Facade Service refactoring。
-
或者,或者,您正在寻找的是context based injection。
-
是的,如果我在 Mode 类中进行了 IGroupingStrategy 注入,那么基于上下文的注入将是有意义的,但注入在链的深处
标签: c# dependency-injection simple-injector