【问题标题】:Is there a better way to do this Structure Map configuration?有没有更好的方法来做这个结构图配置?
【发布时间】:2012-02-28 09:09:33
【问题描述】:

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

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

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

这里是注册表类:

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");
    }
}

这是一个 sn-p,显示了我的应用程序中注册表类的用法。

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

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

【问题讨论】:

    标签: .net dependency-injection structuremap dsl


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多