2012-02-28 56 views
0

我有一個數據處理應用程序,它有幾個工作流程提取數據並生成報告。
工作流程採用數據提取器和報告服務的列表。
要運行的工作流程在運行時確定。有沒有更好的方法來完成這個Structure Map配置?

我已使用結構圖,用於在所述工作流創建給定的工作流程鍵將產生的工作流程的實例。我對結構圖很陌生,在這裏我需要首先進行配置。

這是否看起來是正確的或有我錯過了什麼?有沒有更好的方法來配置這個?

這裏是註冊表類:

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

我要說的是,你有幾件事情是可以改變的。

不需要在註冊表中的新的容器中,添加方法的工作流程中,您可以使用拉姆達(x.GetInstance<Type>("name")獲得實例。

Use方法註冊爲特定實例的默認值。如果你並不需要一個默認情況下,使用Add代替(IReportingService)。

我一般都儘量避免調用配置中的特定構造,因爲它使我們更難新的參數添加到構造器。比較喜歡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>()); 
} 
相關問題