[英]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.