情况
我们最近开始寻找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框架中无法实现这一点?如果是(带有绑定或其他),请提供示例。
这不是常见的注射方案吗?
答案 0 :(得分:4)
为什么在其他DI框架中无法实现这一点?
我无法代替其他DI容器,但Simple Injector支持基于上下文的注入。只需看一下Context based injection in the documentation。
除此之外,还有许多关于此问题的Stackoverflow问题,例如:
这不是通常的注射方案吗?
这取决于。 Simple Injector文档states:
在许多情况下,基于上下文的注入不是最佳解决方案,应重新评估设计。但在某些狭隘的情况下,这是有道理的。
基于上下文注入的常见滥用是解决Liskov Substitution Principle违规行为。