依赖于实现相同接口的两个对象的简单注入器

Simple Injector with dependency on two objects that implement same interface

我正在编写一个应用程序(通过 ASP.NET 网络 API 公开),其全部目的是使用两个数据源,并公开异同。所以 API 具有以下设置:

public class FooController : WebAPI
{
    public FooController(IFooRepository repoFromSourceA, IFooRepository repoFromSourceB)
    {
        ...
    }
}

保持区分哪个来源(SourceA 和 SourceB 不能互换)似乎使 container.RegisterCollection(..) 无法(或非常危险)使用。此外,由于一个 class 正在使用这两种实现,Decorator 似乎不合适。

那么,我将如何设置此依赖项注入?

你的问题很常见。许多开发人员在开始依赖注入时都为此苦苦挣扎。处理这个问题时,找出您是否违反了 Liskov Substitution Principle (LSP) 始终很重要,因为当您这样做时,您应该使用两个单独的接口。永远不要忘记:接口不仅仅是方法签名。这是一份关于该合同的实施方式以及它们的行为的合同return。

您的评论似乎表明您没有违反 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 方法提供了一个断言,即注入依赖项的消费者的构造函数参数的名称包含 "SourceA" 或 "SourceB"。