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()
);
嗨馬丁,我確實遇到過打字工廠,但我無法弄清楚如何將它用於我的目的,因爲我不知道如何正確地進行註冊。我已經更新了我的OP,以顯示我的內容。 – DavidS 2013-05-08 09:45:52
訣竅是,類型化的工廠默認情況下不需要實現。爲了通過int amountoferrors參數解析您的組件,您需要實現ITypedFactoryComponentSelector,如上面鏈接中所述。在那裏你可以根據傳入的methodinfo和參數返回你想要解析的組件的名稱。如果你需要傳遞更多的參數來實例化實現,那麼工廠的簽名需要相應地改變。 (所有參數都需要傳遞給工廠)。 – Martin 2013-05-08 10:00:17
感謝Martin的解釋。對於任何對我如何處理這個問題感興趣的人,我已經寫過關於這個http://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/。 – DavidS 2013-05-08 18:49:08