簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM