当前位置:  开发笔记 > 运维 > 正文

多个接口注入城堡windsor

如何解决《多个接口注入城堡windsor》经验,为你挑选了1个好方法。

当您在容器中有多个实现时,如何让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 marks = new List;
        foreach(ExamAnswers examanswer in examaAnswers)
        {
            marks.Add(_examCalc.CalculateMark);
        }
    }
}

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

希望一切都有所作为

科林G.



1> Chris Canal..:

正如大卫所说,你不能,但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());

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

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有