8

当你在容器中有多个实现时,如何让Windsor城堡在运行时选择正确的界面接口。多个接口注入城堡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); 
     } 
    } 
} 

说出ExamMarkService正在通过Windor resloved我怎样才能确保正确实施是在构造函数注入,这是一个例子多租户问题?

希望所有让SENCE

科林摹

回答

12

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

这将让你轻松处理多头问题:)

1

简短的回答是,你不能。这种选择取决于应用程序代码,所以如果你只是做了container.Resolve<IExamCalc>,那么Windsor无法知道你想要哪一个。

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

3

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

你所有的组件都有唯一的字符串键,所以你可能总是这样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> 
相关问题