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> 
相關問題