Dependency injection castle windsor的多接口注入
当容器中有多个实现时,如何让castle Windsor在运行时选择正确的接口植入 例如,让我们假设我有一个名为IExamCalc的简单接口,它可以计算出某人在考试中的表现 不,我们有几个这样的实现,比如bellowDependency 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
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());