【问题标题】:Castle Windsor Resolve at run timeCastle Windsor Resolve 在运行时解决
【发布时间】:2017-04-19 06:02:07
【问题描述】:

我已经尝试解决这个问题很长一段时间了,但我仍然不明智。我有以下方法:

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()
);

【问题讨论】:

    标签: c# castle-windsor


    【解决方案1】:

    我认为你应该看看温莎的typed factory 设施。 只要参数在实现中与注册中的名称相同,参数就会被传递。

    【讨论】:

    • 嗨马丁,我确实遇到了类型化工厂,但我不知道如何将它用于我的目的,因为我不太清楚如何正确进行注册。我已经更新了我的 OP 以显示我所拥有的。
    • 诀窍是类型化工厂默认情况下不需要实现。为了通过 int amountoferrors 参数解析您的组件,您需要按照上面链接中的说明实现 ITypedFactoryComponentSelector。在那里,您可以根据传入的方法信息和参数返回要解析的组件的名称。如果您需要传递更多参数以实例化实现,则工厂的签名需要相应地更改。 (所有参数都需要传给工厂)。
    • 感谢马丁的解释。对于任何对我是如何做到这一点感兴趣的人,我已经写了一篇关于这个davidsiew.wordpress.com/2013/05/08/…的博客。
    • 感谢大卫在您的博客上提及。
    • 类型化工厂工具只会将参数传递给立即请求的实现类。它不会自动将它们向下传递到依赖链。您需要使用动态参数来完成此操作。
    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多