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