2013-05-08 53 views
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() 
); 

回答

5

我想你应该寻找在温莎的typed factory设施。 只要参与者在实施过程中与注册过程中有相同的名称,就会传递参数。

+0

嗨马丁,我确实遇到过打字工厂,但我无法弄清楚如何将它用于我的目的,因为我不知道如何正确地进行注册。我已经更新了我的OP,以显示我的内容。 – DavidS 2013-05-08 09:45:52

+0

诀窍是,类型化的工厂默认情况下不需要实现。为了通过int amountoferrors参数解析您的组件,您需要实现ITypedFactoryComponentSelector,如上面链接中所述。在那里你可以根据传入的methodinfo和参数返回你想要解析的组件的名称。如果你需要传递更多的参数来实例化实现,那么工厂的签名需要相应地改变。 (所有参数都需要传递给工厂)。 – Martin 2013-05-08 10:00:17

+2

感谢Martin的解释。对于任何对我如何处理这个问题感兴趣的人,我已经写过关于这个http://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/。 – DavidS 2013-05-08 18:49:08