依赖于实现相同接口的两个对象的简单注入器
Simple Injector with dependency on two objects that implement same interface
我正在编写一个应用程序(通过 ASP.NET 网络 API 公开),其全部目的是使用两个数据源,并公开异同。所以 API 具有以下设置:
public class FooController : WebAPI
{
public FooController(IFooRepository repoFromSourceA, IFooRepository repoFromSourceB)
{
...
}
}
保持区分哪个来源(SourceA 和 SourceB 不能互换)似乎使 container.RegisterCollection(..)
无法(或非常危险)使用。此外,由于一个 class 正在使用这两种实现,Decorator 似乎不合适。
那么,我将如何设置此依赖项注入?
你的问题很常见。许多开发人员在开始依赖注入时都为此苦苦挣扎。处理这个问题时,找出您是否违反了 Liskov Substitution Principle (LSP) 始终很重要,因为当您这样做时,您应该使用两个单独的接口。永远不要忘记:接口不仅仅是方法签名。这是一份关于该合同的实施方式以及它们的行为的合同return。
您的评论似乎表明您没有违反 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
方法提供了一个断言,即注入依赖项的消费者的构造函数参数的名称包含 "SourceA" 或 "SourceB"。
我正在编写一个应用程序(通过 ASP.NET 网络 API 公开),其全部目的是使用两个数据源,并公开异同。所以 API 具有以下设置:
public class FooController : WebAPI
{
public FooController(IFooRepository repoFromSourceA, IFooRepository repoFromSourceB)
{
...
}
}
保持区分哪个来源(SourceA 和 SourceB 不能互换)似乎使 container.RegisterCollection(..)
无法(或非常危险)使用。此外,由于一个 class 正在使用这两种实现,Decorator 似乎不合适。
那么,我将如何设置此依赖项注入?
你的问题很常见。许多开发人员在开始依赖注入时都为此苦苦挣扎。处理这个问题时,找出您是否违反了 Liskov Substitution Principle (LSP) 始终很重要,因为当您这样做时,您应该使用两个单独的接口。永远不要忘记:接口不仅仅是方法签名。这是一份关于该合同的实施方式以及它们的行为的合同return。
您的评论似乎表明您没有违反 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
方法提供了一个断言,即注入依赖项的消费者的构造函数参数的名称包含 "SourceA" 或 "SourceB"。