Я мучаюсь с тем, как организовать регистрацию компонентов Autofac в модулях, учитывая, что некоторые из самих модулей имеют зависимости.
Я реализовал абстракция данных конфигурации (т.е. web.config) в интерфейсе:
interface IConfigurationProvider
{
T GetSection(string sectionName)
where T : System.Configuration.ConfigurationSection;
}
вместе с реализациями для ASP.NET (WebConfigurationProvider
) и «настольных» приложений (ExeConfigurationProvider
.
Некоторые из моих модулей autofac требуют IConfigurationProvider
в качестве параметра конструктора, но некоторые этого не требуют:
class DependentModule : Module
{
public DependentModule(IConfigurationProvider config)
{
_config = config;
}
protected override void Load(ContainerBuilder builder)
{
var configSection = _config.GetSection("customSection");
builder.RegisterType(configSection.TypeFromConfig);
}
private readonly IConfigurationProvider _config;
}
class IndependentModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(/* other stuff not based on configuration */);
}
}
Поскольку метод расширения RegisterType()
не принимает делегат регистрации ( Func
), как это делает Register()
, я не могу заранее зарегистрировать IConfigurationProvider
, а затем разрешить его, когда Я иду регистрировать тип, указанный в конфигурации, что-то вроде:
// this would be nice...
builder.RegisterType(c => c.Resolve().GetSection("sectionName").TypeFromConfig);
Это означает, что мне нужно иметь возможность регистрировать модули с зависимостью IConfigurationProvider
и без нее.
Очевидно, как вручную создавать экземпляры каждого модуля и регистрировать их:
IConfigurationProvider configProvider = ...;
var builder = new ContainerBuilder();
builder.RegisterModule(new DependentModule(configProvider));
builder.RegisterModule(new IndependentModule());
using (var container = builder.Build())
{
...
}
Но я не хочу вручную создавать экземпляры своих модулей — я хочу сканировать сборки на наличие модулей и регистрировать их автоматически (как обсуждалось в этом вопросе ). Поэтому мне приходится использовать отражение для сканирования сборки на наличие типов IModule
и использовать Activator.CreateInstance
для создания регистрируемых экземпляров. Но как узнать, следует ли передавать IConfigurationProvider
в качестве параметра конструктора. И что происходит, когда другие модули имеют дополнительные или другие зависимости?
Должен же быть более простой способ выполнения основной задачи: зарегистрировать тип, указанный в некоторой конфигурации, предоставленной через интерфейс, верно? Как мне это сделать?