有没有更好的方法来进行这种结构图配置?

时间:2012-02-28 09:09:34

标签: .net dependency-injection structuremap dsl

我有一个数据处理应用程序,它有几个工作流程,可以提取数据并生成报告 工作流程采用数据提取器列表和报告服务 要运行的工作流程在运行时确定。

我已使用结构图配置了工作流创建,给定工作流密钥,它将生成工作流的实例。我是结构图的新手,这里是我必须工作的第一个配置。

这看起来是正确的还是我错过了什么?有没有更好的方法来配置它?

这是注册表类:

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 个答案:

答案 0 :(得分:1)

我想说你有几件事可以改变。

不需要注册表中的新容器,在工作流的Add方法中,您可以使用lambda(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>());
}