2012-02-28 18 views
0

データ処理アプリケーションがあり、データを抽出してレポートを生成するいくつかのワークフローがあります。
ワークフローには、データエクストラクタとレポートサービスの一覧があります。
実行するワークフローは実行時に決定されます。この構造マップの設定を行うより良い方法はありますか?

構造マップを使用してワークフローの作成を設定しました。ワークフローのキーを指定すると、ワークフローのインスタンスが生成されます。私は構造マップを初めて学びました。ここで私が働かなければならない最初の構成です。

これは正しいか、私は何かを見逃しましたか?これを設定するより良い方法はありますか?ここで

は、レジストリのクラスである:ここで

class WorkflowRegistry : Registry 
{ 
    public WorkflowRegistry() 
    { 
     var container = new Container(x => 
     { 
      x.For<DossierExtraction.Library.Interfaces.IProgressReporter>().Use<ProgressReporter>(); 
      x.For<IDossierService>().Use<DossierService>(); 
      x.For<IReportingService>().Use<VendorReportingService>().Named("VendorReport"); 
      x.For<IReportingService>().Use<ClientReportingService>().Named("ClientReport"); 
     }); 

     For<IWorkflow>().Add(x => new GenericWorkflow(
      new List<IExtractionService>() { container.GetInstance<DossierExtractor>(), container.GetInstance<NativeExtractor>(), container.GetInstance<TranslationExtractor>() }, 
      container.GetInstance<IReportingService>("VendorReport") 
      )).Named("VendorWorkflow"); 

     For<IWorkflow>().Add(x => new GenericWorkflow(
      new List<IExtractionService>() { container.GetInstance<TranslationExtractor>() }, 
      container.GetInstance<IReportingService>("ClientReport") 
      )).Named("Clientflow"); 
    } 
} 

は、私のアプリケーションでレジストリクラスの使用を示す抜粋です。

ObjectFactory.Initialize(x => 
     { 
      x.AddRegistry<WorkflowRegistry>(); 
     }); 

     var workflow = ObjectFactory.GetNamedInstance<IWorkflow>(workflowKey); 
     workflow.Run(); 

答えて

1

私は、あなたが変更できるものがいくつかあると思います。

は、レジストリ内の新しいコンテナが必要とされていない

、ワークフローのAddメソッドの内部では、あなたのラムダ(x.GetInstance<Type>("name")を使用してインスタンスを取得することができます。

Use方法は、特定のインスタンスのデフォルトを登録している。場合あなたの代わりにAddIReportingService)を使用し、デフォルトを必要としません。

私は、一般的に、それはそれは難しいコンストラクタに新しいパラメータを追加することができているので、コンフィギュレーション内の特定のコンストラクタを呼び出さないようにしてください。代わりにCtor方法を好みます。この場合、リストが渡され、これがアプリケーション全体である場合それはCtor/Isコンボで過度になるかもしれません。ここで

は私の提案です:

public WorkflowRegistry() 
{ 
    For<IProgressReporter>().Use<ProgressReporter>(); 
    For<IDossierService>().Use<DossierService>(); 
    For<IReportingService>().Add<VendorReportingService>().Named("VendorReport"); 
    For<IReportingService>().Add<ClientReportingService>().Named("ClientReport"); 

    For<IWorkflow>().Add<GenericWorkflow>().Named("VendorWorkflow") 
     .Ctor<IReportingService>() 
     .Is(c => c.GetInstance<IReportingService>("VendorReport")) 
     .EnumerableOf<IExtractionService>().Contains(
      x => { 
       x.Type<DossierExtractor>(); 
       x.Type<NativeExtractor>(); 
       x.Type<TranslationExtractor>(); 
      }); 

    For<IWorkflow>().Add<GenericWorkflow>().Named("Clientflow") 
     .Ctor<IReportingService>() 
     .Is(c => c.GetInstance<IReportingService>("ClientReport")) 
     .EnumerableOf<IExtractionService>() 
     .Contains(x => x.Type<TranslationExtractor>()); 
} 
関連する問題