Модули Autofac со своими зависимостями

Я мучаюсь с тем, как организовать регистрацию компонентов 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в качестве параметра конструктора. И что происходит, когда другие модули имеют дополнительные или другие зависимости?

Должен же быть более простой способ выполнения основной задачи: зарегистрировать тип, указанный в некоторой конфигурации, предоставленной через интерфейс, верно? Как мне это сделать?

8
задан Community 23 May 2017 в 12:15
поделиться