[英]Register multiple implementations of same interface in Castle Windsor
[英]Castle Windsor multiple implementations of interface
我有以下安裝程序,但由於某些奇怪的原因,它無法正確解析。 我有一個接口,其中有 2 個實現,但想根據naming conventions
注入正確的實例。
我期望在這種情況下,將根據它們的命名方式注入正確的ICommand
實例。 然而,出於某種奇怪的原因,兩個控制器都選擇了第一個實例,即FooCommand
因為它是在安裝程序中首先定義的。
不確定我做錯了什么? 也許,有沒有其他方法可以做到這一點?
public interface ICommand { }
public class FooCommand : ICommand { }
public class BarCommand : ICommand { }
public class SomeController : ApiController
{
public SomeController(ICommand fooCommand) { }
}
public class HelloController : ApiController
{
public HelloController(ICommand barCommand) { }
}
container.Register(
Component.For<ICommand>()
.Named("fooCommand")
.ImplementedBy<FooCommand>()
.LifestyleSingleton(),
Component.For<ICommand>()
.Named("barCommand")
.ImplementedBy<BarCommand>()
.LifestyleSingleton());
就像@steven 所說的那樣,這通常不是一個好主意,如果管理不當可能會導致可發現性問題,但假設您知道自己在做什么,您可以構建一個IContributeComponentModelConstruction
來匹配控制器上ICommand
類型的構造函數參數具有相同名稱的 Windsor 組件。
public class ControllerCommandMatcher : IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel, ComponentModel model)
{
// or whatever other condition to bail out quickly
if (model.Implementation.Name.EndsWith("Controller") == false) return;
foreach (var constructor in model.Constructors)
{
foreach (var dependency in constructor.Dependencies)
{
if (dependency.TargetItemType != typeof (ICommand)) continue;
dependency.Parameter = new ParameterModel(dependency.DependencyKey,
ReferenceExpressionUtil.BuildReference(dependency.DependencyKey));
}
}
}
}
棘手的一點是:
new ParameterModel(dependency.DependencyKey,
ReferenceExpressionUtil.BuildReference(dependency.DependencyKey))
它基本上告訴 Windsor 依賴項(構造函數參數),例如fooCommand
應該滿足同名組件( fooCommand
)。
然后將您的貢獻者添加到容器中
container.Kernel.ComponentModelBuilder.AddContributor(new ControllerCommandMatcher());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.