上下文相关的注射构架
最近,我们开始寻找适合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
类(和它使用的任何服务)必须登录到一个特殊的地方。但是我可以想象出可能适用的类似场景(例如,解决循环依赖)。
的问题(S)
这是为什么无法在其他DI框架?如果是(带有绑定或其他),请举例说明。
这是不常见的注射情况?
为什么在其他DI框架中这是不可能的?
我不能说其他DI容器,但基于上下文的注射由Simple Injector支持。只要看看Context based injection in the documentation。
除此之外,大约有无数的问题#1本,如:
- Ninject WhenInjectedInto equivalent in Simple Injector
- Simple Injector conditional injection
- ContextDependent instance as Singleton in Simple Injector
这难道不是一个通常的注射情况?
这取决于。简单注射器文档states:
在许多情况下,基于上下文注入是不是最好的解决方案,设计应重新评估。但在一些狭窄的情况下,它可能是有道理的。
常见的基于上下文的注入滥用是为了解决Liskov Substitution Principle违规问题。
经过一些额外的洞察,我看到这个问题基本上是如何将两个完全独立的问题合并为一个 - 而第二个基本问题则是征求意见。然而,我没有看到如何改革问题以符合要求,所以我会保持原样。可能对某人仍然有用。 – betelgewse