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似乎不合适.
那么,我将如何设置此依赖注入?
你有一个非常普遍的问题.当从依赖注入开始时,许多开发人员都在努力解决这个问题.处理此问题时,最重要的是要确定您是否违反了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"的名称.
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |