У меня есть проект 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 не удалось разрешить.
Есть ли правильный способ сделать это?