Castle Windsor在运行时解决

Dav*_*idS 8 c# 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");
}
Run Code Online (Sandbox Code Playgroud)

我遇到麻烦的代码涉及到我正在创建的返回值,理想情况下我想留给温莎城堡处理.那么,我接下来要创建一个抽象工厂:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

而我的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;
}
Run Code Online (Sandbox Code Playgroud)

我遇到的很多问题是如何进行注册并动态传入参数,因为CreateReportResult的构造函数是:

public CreateReportResult(IResultActioner resultActioner, Uri filePath, string patientId, string dataSource)
Run Code Online (Sandbox Code Playgroud)

所以问题是我如何在我的WindsorContainer安装程序中设置我的注册码,然后如何传递所需的参数?我正在使用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()
);
Run Code Online (Sandbox Code Playgroud)

Mar*_*tin 5

我想你应该看看温莎的打字工厂.只要在实施中与注册中具有相同的名称,参数就会被传递.

  • 谢谢马丁的解释.对于任何对我这样做感兴趣的人,我都在博客上写了这篇http://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/. (2认同)