我正在编写一个应用程序(通过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] 删除。
我来说两句