各种DI框架中的上下文相关注入

时间:2017-04-11 08:49:39

标签: c# dependency-injection autofac structuremap simple-injector

情况

我们最近开始寻找NInject的替代品。我们查看了Simple-Injector,AutoFac和StructureMap。但是在我们的测试中,我们无法重现NIinject中可能的绑定,但在其他框架中却没有。

问题

假设我们有以下通过多个应用程序使用的接口:

public interface IRepository {...}

public interface ILog {...}

使用IRepository的默认实现:

public class DefaultRepository : IRepository {
    public DefaultRepository(ILog logger) {...}
}

以及ILog的两个实现 - 一个DefaultLogger和另一个SimpleLogger

两个消耗IRepository的类:

public class Crypter {
    public Crypter(IRepository repository) {...}
}

public class OtherService {
    public OtherService(IRepository repository) {...}
}

我们想要实现的目标如下:

  • ILog绑定到SimpleLogger注入其中的任何其他类时,将Crypter绑定到SimpleLogger。在示例中,DefaultRepository会被注入Crypter注入ILog

  • DefaultLogger绑定到DefaultLogger以获取所有其他绑定。在我们的示例中,DefaultRepository会被注入OtherService注入Crypter

这是由于SessionStore类(以及它使用的任何服务)必须记录到特殊位置。但我可以想象类似的情况,这可能是适用的(例如,解决循环依赖)。

问题

  • 为什么在其他DI框架中无法实现这一点?如果是(带有绑定或其他),请提供示例。

  • 这不是常见的注射方案吗?

1 个答案:

答案 0 :(得分:4)

  

为什么在其他DI框架中无法实现这一点?

我无法代替其他DI容器,但Simple Injector支持基于上下文的注入。只需看一下Context based injection in the documentation

除此之外,还有许多关于此问题的Stackoverflow问题,例如:

  

这不是通常的注射方案吗?

这取决于。 Simple Injector文档states

  

在许多情况下,基于上下文的注入不是最佳解决方案,应重新评估设计。但在某些狭隘的情况下,这是有道理的。

基于上下文注入的常见滥用是解决Liskov Substitution Principle违规行为。