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

游侠

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

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

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

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

史蒂文

您的问题很常见。当从依赖注入开始时,许多开发人员为此感到困惑。处理此问题时,找出是否违反了Liskov替代原则(LSP)始终很重要,因为这样做时,您应该改用两个单独的接口。永远不要忘记:接口不仅仅是方法签名。它是关于该合同的实现如何行为以及它们返回什么的合同。

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

在简单的喷油器来处理这个问题的方法是使用基于上下文的注射使用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”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

结构图-相同接口的两个实现

如何在依赖于两个变量的函数中仅对一个变量使用“ for”循环?

Rxjs:将两个流与一个依赖于另一个的流合并

合并实现相同接口的两个类列表

如何对依赖于属性的UML中的接口实现建模?

在不依赖于引发错误的情况下,检查两个对象是否彼此可比

如何为实现两个接口的类注册依赖项注入

两个异步任务-一个依赖于python中的另一个

使用依赖于其他两个列的元素创建data.frame列(在R中)

如果一个属性依赖于两个属性的组合,那么这是功能依赖吗?

SELECT查询依赖于其他两个表

在简单注入器中将两个接口注册为单例的类的行为是什么

当两个apt程序包依赖于同一程序包的两个不同版本时,会发生什么情况?

C ++ Koenig(依赖于参数)查找:如果不同名称空间中的两个名称空间函数具有相同的参数类型怎么办?

如何返回依赖于两个函数的函数?

具有通用接口和简单注入器的依赖注入

如何按组求和并添加依赖于 SAS SQL 中其他两个变量的新变量

更新依赖于同一个表中的其他两个列的列

如何让两个垂直元素之一的高度依赖于另一个?

在删除重复项时合并两个多维数组,依赖于它们的特定元素

使用 RxJava 更新依赖于其他两个 API 响应的对象列表

如何绘制依赖于离散热图中两个变量的数据

在依赖于顺序响应的 MySQL 的两个查询之间注入 API 调用

两个不同的对象以相同的方式实现相同的接口——如何保持 DRY

两个下拉选择对象,禁用一些依赖于 jQuery 中第 1 选项的第 2 选项

两个动态选择框都具有数据属性并依赖于它们

构建依赖于公共代码的两个 Docker 容器的最佳方法是什么?

依赖注入有两个相同依赖的实例

如何在一帧中绘制依赖于相同类别的两个变量