我已经尝试解决这个问题很长一段时间了,但我仍然不明智。我有以下方法:
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");
}
我遇到问题的代码涉及我正在更新的返回值,理想情况下我想留给温莎城堡来处理。所以,我当时做的是创建一个抽象工厂:
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 安装程序中设置我的注册码,然后我如何传递所需的参数?我使用的是温莎城堡 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()
);