2013-05-08 4 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"); 
} 

나는에 문제가있어 코드가 이상적으로 내가 다루는 성 윈저에두고 싶습니다 I가 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"); 
    } 
} 

을 내 구문 분석 방법은 지금된다 :

을 수행하는 방법이다와 나는 문제의 큰 거래를 보내고있어 무엇
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; 
} 

public CreateReportResult(IResultActioner resultActioner, Uri filePath, string patientId, string dataSource) 

그래서 질문이 내 WindsorContainer 설치 내 등록 코드를 설정하는 방법과 사용 방법은 다음 PA : CreateReportResult의 생성자이기 때문에 동적으로 등록하고 매개 변수 전달 필수 매개 변수에 ss? Castle Windsor 3.2를 사용하고 있습니다. 난 당신이 윈저의 typed factory 시설에보고해야한다고 생각

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

: 여기

내가 내 등록에있는 코드입니다. 매개 변수는 등록시와 동일한 이름을 가진 경우 전달됩니다.

+0

안녕하세요 마틴, 입력 된 공장을 방문했는데 제대로 등록하는 법을 모르기 때문에 내 용도로 사용하는 방법을 알 수 없습니다. 나는 내가 가진 것을 보여주기 위해 나의 OP를 업데이트했다. – DavidS

+0

트릭은 입력 된 팩토리가 기본적으로 구현을 요구하지 않는다는 것입니다. int amountoferrors 매개 변수로 구성 요소를 해결하려면 위 링크에서 설명한대로 ITypedFactoryComponentSelector를 구현해야합니다. 메소드 인포 및 전달 된 매개 변수에 따라 해결하려는 구성 요소의 이름을 반환 할 수 있습니다. 구현을 인스턴스화하기 위해 더 많은 매개 변수를 전달해야하는 경우 이에 따라 팩토리의 서명을 변경해야합니다. (모든 매개 변수는 공장으로 전달되어야 함). – Martin

+2

마틴 설명 주셔서 감사합니다. 내가이 일에 관심이있는 사람이라면 http://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/에 대해 블로그를 작성했습니다. – DavidS