Как разделить конфигурацию структуры карты на несколько реестров с их собственным поведением сканирования? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть проект ASP.NET Core с довольно сложной конфигурацией StructureMap. Я разделил его на пару разных реестров на основе модулей, которые они конфигурируют, но я не смог понять, как разделить поведение сканирования. Я хотел бы поместить конфигурацию сканирования в соответствующие реестры.

Раньше все конфигурации сканирования были в одном вызове сканирования, например:

Scan(scan =>
{
    scan.TheCallingAssembly();
    scan.AssembliesAndExecutablesFromApplicationBaseDirectory();
    scan.WithDefaultConventions();
    scan.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
    scan.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>));
    scan.AddAllTypesOf(typeof(IValidator<>));
    scan.AddAllTypesOf(typeof(IEventHandler<>));
    scan.AddAllTypesOf(typeof(IProjection<>));
});

Это работает так, как и ожидалось.

Вот мои ConfigureServices и реестры, как я хотел бы иметь его -

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    // Other service configurations ....

    // StructureMap
    var container = new Container();
    container.Configure(config =>
    {
        config.Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.AssembliesAndExecutablesFromApplicationBaseDirectory();
            scan.WithDefaultConventions();
        });
        config.AddRegistry<MediatorRegistry>();
        config.AddRegistry(new EventBusRegistry(
            Configuration, HostingEnvironment, LoggerFactory));
        config.AddRegistry(new ApplicationRegistry(
            Configuration, HostingEnvironment, LoggerFactory));
        config.AddRegistry(new PresentationRegistry(
            Configuration, HostingEnvironment, LoggerFactory));
        config.Populate(services);
    });
    return container.GetInstance<IServiceProvider>();
}

public class EventBusRegistry : Registry
{
    public EventBusRegistry(IConfiguration configuration, 
        IHostingEnvironment environment, ILoggerFactory loggerFactory)
    {
        Scan(scan =>
        {
            scan.AddAllTypesOf(typeof(IEventHandler<>));
        });

         // other config
    }
}

public class MediatorRegistry : Registry
{
    public MediatorRegistry()
    {
        Scan(scan =>
        {
            scan.ConnectImplementationsToTypesClosing(
                typeof(IRequestHandler<,>));
            scan.ConnectImplementationsToTypesClosing(
                typeof(INotificationHandler<>));
        });

        // other configurations ...
    }
}

public class ApplicationRegistry : Registry
{
    public TraceabilityRegistry(IConfiguration configuration,
        IHostingEnvironment environment, ILoggerFactory loggerFactory)
    {
        Scan(scan =>
        {
            scan.AddAllTypesOf(typeof(IValidator<>));
        });

        // other configurations ...
    }
}

public class PresentationRegistry : Registry
{
    public PresentationRegistry(
        IConfiguration configuration, IHostingEnvironment environment, 
        ILoggerFactory loggerFactory)
    {
        Scan(scan =>
        {
            scan.AddAllTypesOf(typeof(IProjection<>));
        });

      // other configurations ...

    }
}

Мои другие реестры

Я проверил это, разделив сканирование на несколько реестров, и оно не полностью завершилось с ошибкой, но мои обработчики MediatR не удалось разрешить.

Есть ли правильный способ сделать это?

...