Я борюсь с тем, как организовать регистрацию компонентов Autofac в модулях, учитывая, что некоторые из модулей сами имеют зависимости.Модули Autofac со своими зависимостями
Я реализовал абстракцию данных конфигурации (т.е. web.config) в интерфейсе:
interface IConfigurationProvider
{
T GetSection<T>(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<CustomConfigSection>("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<IComponentContext, T>
), как Register()
делает , я не могу зарегистрировать IConfigurationProvider
до фронта, а затем решить, когда я иду, чтобы зарегистрировать тип, указанный в конфигурации, что-то вроде:
// this would be nice...
builder.RegisterType(c => c.Resolve<IConfigurationProvider>().GetSection<CustomConfigSection>("sectionName").TypeFromConfig);
Это означает, что Мне нужно иметь возможность регистрировать модули с и без зависимости от IConfigurationProvider
.
Это очевидно, как вручную создать экземпляр каждого модуля и зарегистрировать его:
IConfigurationProvider configProvider = ...;
var builder = new ContainerBuilder();
builder.RegisterModule(new DependentModule(configProvider));
builder.RegisterModule(new IndependentModule());
using (var container = builder.Build())
{
...
}
Но я не хочу, чтобы вручную создать экземпляр мои модули - Я хочу, чтобы сканировать сборки модулей и зарегистрировать их автоматически (как обсуждалось in this question). Поэтому я должен использовать отражение для сканирования сборки для типов IModule
и использовать Activator.CreateInstance
для создания регистрируемых экземпляров. Но как узнать, следует ли передавать IConfigurationProvider
в качестве параметра конструктора. И что происходит, когда другие модули имеют дополнительные или разные зависимости?
Должен быть более простой способ выполнения основной задачи: зарегистрируйте тип, указанный в некоторой конфигурации, предоставляемой через интерфейс, не так ли? Итак, как мне это сделать?
Вы решили это в конце? У меня очень похожий случай, но моя зависимость в свою очередь имеет другую зависимость (я хочу получить конфигурацию из db, поэтому у меня есть IConfigProvider, зависящий от IRepoConfig) – Learner
@Learner, я изначально реализовал что-то, используя комбинацию Autofac и MEF, смоделированных после ответа Джима Боллы ниже, но это было ужасно сложно, и я удалил его слишком долго.У меня больше нет зависимых модулей: поскольку мой основной вариант использования - это выбор, основанный на «типе», с тех пор я принял подход * регистрации * ** всех ** кандидатов, затем * разрешаю * на основе свойство, поступающее из 'ConfigurationSection'. Я могу отправить вам пример кода, если хотите. –
Хорошо, спасибо. Я не думаю, что могу использовать ConfigurationSection/xml в моем случае. – Learner