Есть ли лучший способ сделать эту конфигурацию структуры карты? - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть приложение для обработки данных, оно имеет несколько рабочих процессов, которые извлекают данные и генерируют отчет.
Рабочие процессы принимают список экстракторов данных и службы отчетов.
Рабочий процесс определяется во время выполнения.

Я настроил создание рабочего процесса, используя карту структуры, учитывая ключ рабочего процесса, он сгенерирует экземпляр рабочего процесса. Я новичок в структурировании карты, и вот первая конфигурация, которую я получил для работы.

Это выглядит правильно или я что-то пропустил? Есть ли лучший способ настроить это?

Вот класс реестра:

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 Ответ

1 голос
/ 29 февраля 2012

Я бы сказал, что у вас есть пара вещей, которые можно изменить.

Новый контейнер в реестре не нужен, внутри методов Add для рабочих процессов вы можете получить экземпляр, используя вашу лямбду (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>());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...