c# - 依赖于实现相同接口(interface)的两个对象的简单注入(inject)器

标签 c# asp.net-web-api dependency-injection simple-injector

我正在编写一个应用程序(通过 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/

相关文章:

c# - 为什么 HttpClient 不保存基地址,即使它在 Startup 中设置

java - Spring AMQP - 将 ListenerContainer 传递给 bean

c# - 如何避免依赖注入(inject)构造函数的疯狂?

c# - 静态存储库...不能使用 DI,怎么办?

c# - 最短编码,十六进制

c# - 使用第一个数据表过滤多个数据表

c# - 使用 avimanager 从图像生成视频会引发错误

c# - 调试 .Net 网络 API

c# - 网站地址验证的正则表达式

c# - X-HTTP-Method-Override 在 ASP.NET Web API 上给出 NotFound (404)