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

を、私の解析方法について、次のようになります。

行う方法であると私は問題の多くを抱えている何
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を使用しています。ここで

は、私は私の登録を持っているコードです:

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

+0

型付きのファクトリは、デフォルトでは実装を必要としないということです。 int amountoferrorsパラメータでコンポーネントを解決するには、上のリンクで説明したようにITypedFactoryComponentSelectorを実装する必要があります。メソッドインフォと渡されたパラメータに基づいて、解決したいコンポーネントの名前を返すことができます。実装をインスタンス化するためにさらに多くのパラメータが渡される必要がある場合は、それに応じて変更する必要があります。 (すべてのパラメータは工場に渡す必要があります)。 – Martin

+2

マーティンの説明をありがとう。どのように私がこれについて行ったか興味を持っている人のために、私はこのhttp://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/についてブログに書いています。 – DavidS

関連する問題