我有一个数据处理应用程序,它有几个工作流程,可以提取数据并生成报告 工作流程采用数据提取器列表和报告服务 要运行的工作流程在运行时确定。
我已使用结构图配置了工作流创建,给定工作流密钥,它将生成工作流的实例。我是结构图的新手,这里是我必须工作的第一个配置。
这看起来是正确的还是我错过了什么?有没有更好的方法来配置它?
这是注册表类:
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();
答案 0 :(得分:1)
我想说你有几件事可以改变。
不需要注册表中的新容器,在工作流的Add方法中,您可以使用lambda(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>());
}