Dependency injection castle windsor的多接口注入

Dependency injection castle windsor的多接口注入,dependency-injection,inversion-of-control,castle-windsor,Dependency Injection,Inversion Of Control,Castle Windsor,当容器中有多个实现时,如何让castle Windsor在运行时选择正确的接口植入 例如,让我们假设我有一个名为IExamCalc的简单接口,它可以计算出某人在考试中的表现 不,我们有几个这样的实现,比如bellow public interface IExamCalc { int CalculateMark(ExamAnswers examAnswers) } public class WritenExam : IExamCalc { public int Calculate

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

例如,让我们假设我有一个名为IExamCalc的简单接口,它可以计算出某人在考试中的表现

不,我们有几个这样的实现,比如bellow

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);
        }
    }
}
公共接口IExamCalc
{
int计算标记(ExamAnswers ExamAnswers)
}
公共类WritenExam:IExamCalc
{
公共整数计算标记(ExamAnswers ExamAnswers)
{
返回4;
}
}
公共类OralExam:IExamCalc
{
公共整数计算标记(ExamAnswers ExamAnswers)
{
返回8;
}
}
公共类ExamMarkService
{
私人IExamCalc(u examCalc);
公共ExamMarkService(IExamCalc examCalc)
{
_examCalc=examCalc;
}
公共int[]计算exammarks(ExamAnswers[]ExamAnswers)
{
IList标记=新列表;
foreach(ExamAnswers ExamAnswers中的examanswer)
{
标记。添加(_examCalc.CalculateMark);
}
}
}
假设ExamMarkService正在通过Wind重新发布,或者我如何确保在构造函数中注入正确的实现,这是一个多租户问题的示例

希望一切都有意义


科林G

简单的回答是,你不能。这种选择取决于应用程序代码,因此如果您只是执行了
container.Resolve
,那么Windsor无法知道您想要哪一个


要问的问题是,您如何知道使用哪种类型?

多租户被定义为能够在一个实例上运行您的软件,为多个租户/客户/客户端提供服务。我想在多租户设置中,您可能会更频繁地遇到类似的问题

所有组件都有键,这些键是唯一的字符串,因此您可以始终使用容器.Resolve(“someKey”)来获得特定的实现

如果您希望自动注入特定的实现,您可以这样配置组件(在我的内存中,可能不是100%精确):


${someService.customer1}

正如大卫所说,你不能,但IHandlerSelector会让你掌控一切。查看测试,了解如何使用它们:

基本上,您可以执行以下操作:

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.Kernel.AddHandlerSelector(new WritenExamHandler());