gpt4 book ai didi

dependency-injection - 与城堡温莎的多接口(interface)注入(inject)

转载 作者:行者123 更新时间:2023-12-04 05:35:51 25 4
gpt4 key购买 nike

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

例如,假设我有一个名为 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 我如何确保在构造函数中注入(inject)了正确的实现,这是 Multi-Tenancy 问题的一个例子吗?

希望一切都有意义

科林·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());

这将使您轻松处理 Multi-Tenancy 问题:)

关于dependency-injection - 与城堡温莎的多接口(interface)注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/313796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com