简单的Injector,依赖于实现相同接口的两个对象

Ran*_*ger 3 c# dependency-injection simple-injector asp.net-web-api

我正在编写一个应用程序(通过ASP.NET Web API公开),其目的是消耗两个数据源,并揭示相似之处和不同之处.因此API具有以下设置:

public class FooController : WebAPI
{
    public FooController(IFooRepository repoFromSourceA, IFooRepository repoFromSourceB)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

保持哪一个来源(SourceA和SourceB不能互换)的区​​别似乎使得container.RegisterCollection(..)不可能(或非常危险)使用.此外,由于一个类正在消耗两个实现,因此Decorator似乎不合适.

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

Ste*_*ven 6

你有一个非常普遍的问题.当从依赖注入开始时,许多开发人员都在努力解决这个问题.处理此问题时,最重要的是要确定您是否违反了Liskov替换原则(LSP),因为当您这样做时,您应该使用两个单独的接口.永远不要忘记:界面不仅仅是方法签名.它是一份合同,说明合同的实施方式以及它们返回的内容.

您的评论似乎表明您没有违反LSP,因为它们的行为是相同的,并且它们可以相互交换(它可能会破坏应用程序,但它不会破坏消费者).

在Simple Injector中处理此问题的方法是使用方法使用基于上下文的注入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"));
Run Code Online (Sandbox Code Playgroud)

这里为该RegisterConditional方法提供了一个谓词,其中注入依赖关系的使用者的构造函数参数具有包含"SourceA"或"SourceB"的名称.