上下文相关的注射构架

问题描述:

情况上下文相关的注射构架

最近,我们开始寻找适合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) {...} 
} 

我们要实现什么是以下几点:

  • 绑定ILogSimpleLogger当它被注入Crypter任何其他类注入它。在示例出的SimpleLogger将被注入到DefaultRepository将其注入到Crypter

  • 绑定ILogDefaultLogger对于所有其他的绑定。在我们的例子中DefaultLogger将被注入到DefaultRepository将其注入到OtherService

这是由于Crypter类(和它使用的任何服务)必须登录到一个特殊的地方。但是我可以想象出可能适用的类似场景(例如,解决循环依赖)。

的问题(S)

  • 这是为什么无法在其他DI框架?如果是(带有绑定或其他),请举例说明。

  • 这是不常见的注射情况?

+0

经过一些额外的洞察,我看到这个问题基本上是如何将两个完全独立的问题合并为一个 - 而第二个基本问题则是征求意见。然而,我没有看到如何改革问题以符合要求,所以我会保持原样。可能对某人仍然有用。 – betelgewse

为什么在其他DI框架中这是不可能的?

我不能说其他DI容器,但基于上下文的注射由Simple Injector支持。只要看看Context based injection in the documentation

除此之外,大约有无数的问题#1本,如:

这难道不是一个通常的注射情况?

这取决于。简单注射器文档states

在许多情况下,基于上下文注入是不是最好的解决方案,设计应重新评估。但在一些狭窄的情况下,它可能是有道理的。

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