繁体   English   中英

多个接口注入城堡windsor

[英]Multiple Interface injection with castle windsor

当您在容器中有多个实现时,如何让Castle Windsor在运行时选择正确的接口植入。

例如,假设我有一个名为IExamCalc的简单界面,它可以计算出某人在该考试中的表现。

不,我们有几个像这样的实现,例如,

public interface IExamCalc
{
    int CalculateMark(ExamAnswers examAnswers)
}

public class WritenExam : IExamCalc
{
    public int CalculateMark(ExamAnswers examAnswers)
    {
         return 4;
    }
}

public class OralExam : IExamCalc
{
    public int CalculateMark(ExamAnswers examAnswers)
    {
         return 8;
    }
}

public class ExamMarkService
{
    private IExamCalc _examCalc;
    public ExamMarkService(IExamCalc examCalc)
    {
        _examCalc = examCalc;
    }

    public int[] CalculateExamMarks(ExamAnswers[] examAnswers)
    {
        IList<int> marks = new List<int>;
        foreach(ExamAnswers examanswer in examaAnswers)
        {
            marks.Add(_examCalc.CalculateMark);
        }
    }
}

假设通过Windor恢复了ExamMarkService如何确保在构造函数中注入正确的实现,这是多租户问题的一个例子吗?

希望一切都有所作为

科林G.

正如大卫所说,你不能,但IHandlerSelector将让你掌控。 查看测试以了解如何使用它们: https//svn.castleproject.org/svn/castle/trunk/InversionOfControl/Castle.Windsor.Tests/HandlerSelectorsTestCase.cs

基本上,你会做类似的事情:

public class WritenExamHandler : IHandlerSelector
    {
        public bool HasOpinionAbout(string key, Type service)
        {
            // Decision logic here
            return somethingThatWouldBeTrueToSelectWritenExam && service == typeof(IExamCalc);
        }

        public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
        {
            return handlers.Where(handler => handler.ComponentModel.Implementation == typeof (WritenExam)).First();
        }
    }

然后你注册它:

container.Kernel.AddHandlerSelector(new WritenExamHandler());

这将使您轻松处理多个问题:)

多租户定义为能够在一个实例上运行您的软件,为多个租户/客户/客户提供服务。 我想你可能会在多租户设置中经常遇到像你这样的问题。

所有组件都具有唯一字符串的键,因此您可以始终使用container.Resolve("someKey")来获取特定的实现。

如果你想自动注入一个特定的实现,你可以像这样配置你的组件(关闭我的内存,可能不是100%精确):

<component id="someService.customer1" service="ISomeService" type="Customer1SomeService" />

<component id="anotherId" service="IAnotherService" type="AnotherService">
    <parameters>
        <parameterName> <!-- as written in the ctor's signature -->
           ${someService.customer1}
        </parameterName>
    </parameters> 
</component>

简短的回答是,你做不到。 这种选择取决于应用程序代码,所以如果你刚做了container.Resolve<IExamCalc> ,那么Windsor就不知道你想要哪一个。

要问的问题是, 怎么知道要使用哪种类型?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM