2013-05-08 83 views
8

我一直在嘗試解決這個問題很長一段時間,但我仍然不明智。我有以下方法:Castle Windsor在運行時解決問題

public IResult Parse(string[] args) 
{ 
    var argumentOption = new ArgumentOption(_dataModelBinder); 
    var boundArgumentOption = argumentOption.Bind(args); 

    var bindingResults = boundArgumentOption.Validate(_argumentOptionValidator); 

    // AREA OF INTEREST 
    if (bindingResults.Any()) 
    { 
     return new ErrorResult(); 
    } 

    return new CreateReportResult(
     _resultActioner 
     , boundArgumentOption.OutputFilePath 
     , boundArgumentOption.PatientId 
     , "database"); 
} 

我遇到的麻煩的代碼涉及到的返回值我敢newing起來,在理想情況下,我想離開溫莎城堡來處理。那麼,是什麼話,我所做的就是創建一個抽象工廠:

public interface IResultFactory 
{ 
    IResult Create(int numOfErrors); 
} 

public class ResultFactory : IResultFactory 
{ 
    private readonly IWindsorContainer _container; 

    public ResultFactory(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public IResult Create(int numOfErrors) 
    { 
     if (numOfErrors > 0) 
     { 
      return _container.Resolve<IResult>("ErrorResult"); 
     } 

     return _container.Resolve<IResult>("CreateReportResult"); 
    } 
} 

和我的Parse方法現在變成:

public IResult Parse(string[] args) 
{ 
    var argumentOption = new ArgumentOption(_dataModelBinder); 
    var boundArgumentOption = argumentOption.Bind(args); 

    var bindingResults = boundArgumentOption.Validate(_argumentOptionValidator); 

    IResult result = _factory.Create(bindingResults.Count()); 

    return result; 
} 

我有問題了大量與什麼是怎麼做的登記和動態傳遞的參數,因爲CreateReportResult的構造是:

public CreateReportResult(IResultActioner resultActioner, Uri filePath, string patientId, string dataSource) 

所以,問題是我怎麼設置我的註冊碼在我WindsorContainer安裝程序,我怎麼那麼PA SS在所需的參數?我正在使用Castle Windsor 3.2。

這裏是我在我的註冊代碼:

container.Register(
    Component 
    .For<IResult>() 
    .ImplementedBy<ErrorResult>() 
    .Named("ErrorResult") 
    .LifeStyle.Transient 
    , Component.For<IResultFactory>() 
    .AsFactory() 
); 

container.Register(
    Component 
    .For<IResult>() 
    .ImplementedBy<CreateReportResult>() 
    .Named("CreateReportResult") 
    .LifeStyle.Transient 
    , Component.For<IResultFactory>() 
    .AsFactory() 
); 

回答

5

我想你應該尋找在溫莎的typed factory設施。 只要參與者在實施過程中與註冊過程中有相同的名稱,就會傳遞參數。

+0

嗨馬丁,我確實遇到過打字工廠,但我無法弄清楚如何將它用於我的目的,因爲我不知道如何正確地進行註冊。我已經更新了我的OP,以顯示我的內容。 – DavidS 2013-05-08 09:45:52

+0

訣竅是,類型化的工廠默認情況下不需要實現。爲了通過int amountoferrors參數解析您的組件,您需要實現ITypedFactoryComponentSelector,如上面鏈接中所述。在那裏你可以根據傳入的methodinfo和參數返回你想要解析的組件的名稱。如果你需要傳遞更多的參數來實例化實現,那麼工廠的簽名需要相應地改變。 (所有參數都需要傳遞給工廠)。 – Martin 2013-05-08 10:00:17

+2

感謝Martin的解釋。對於任何對我如何處理這個問題感興趣的人,我已經寫過關於這個http://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/。 – DavidS 2013-05-08 18:49:08