我正在编写一个应用程序(通过 ASP.NET Web API 公开),其全部目的是使用两个数据源,并公开异同。因此 API 具有以下设置:
public class FooController : WebAPI
{
public FooController(IFooRepository repoFromSourceA, IFooRepository repoFromSourceB)
{
...
}
}
保持区分哪个来源(SourceA 和 SourceB 不能互换)似乎使 container.RegisterCollection(..)
无法使用(或非常危险)。此外,由于一个类同时使用两个实现,装饰器似乎不合适。
那么,我将如何设置这种依赖注入(inject)?
最佳答案
您的问题很常见。许多开发人员在开始依赖注入(inject)时都为此苦苦挣扎。在处理这个问题时,找出您是否违反了 Liskov Substitution Principle 总是很重要的。 (LSP),因为当你这样做时,你应该使用两个单独的接口(interface)。永远不要忘记:接口(interface)不仅仅是方法签名。它是关于该契约(Contract)的实现方式以及它们返回什么的契约(Contract)。
您的评论似乎表明您没有违反 LSP,因为它们的行为是相同的并且可以相互交换(这可能会破坏应用程序,但不会破坏消费者)。
在 Simple Injector 中处理这个问题的方法是使用 context based injection使用 RegisterConditional
方法。例如:
container.RegisterConditional<IFooRepository, FooRepoA>(
c => c.Consumer.Target.Parameter.Name.Contains("SourceA"));
container.RegisterConditional<IFooRepository, FooRepoB>(
c => c.Consumer.Target.Parameter.Name.Contains("SourceB"));
此处为 RegisterConditional
方法提供了一个断言,即注入(inject)依赖项的使用者的构造函数参数的名称包含“SourceA”或“SourceB”。
关于c# - 依赖于实现相同接口(interface)的两个对象的简单注入(inject)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630567/