Autofac модуль регистрации

Я в основном использовал Ninject, поэтому прошу прощения, если я перепутал терминологию.

Я создал модуль регистратора для обработки NLog, используя имя класса назначения в качестве имени регистратора. Это очень похоже на это: http://docs.autofac.org/en/latest/examples/log4net.html?highlight=log4net

У меня также есть модуль, созданный в моем слое обслуживания, который заботится обо всех регистрациях уровня обслуживания. Выглядит так:

public class ServiceModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
       builder.Register(x => new AccountService(x.Resolve<ILogger>()))
            .As<IAccountService>()
            .InstancePerRequest();
    }
}

Вот моя автоматическая регистрация:

var builder = new ContainerBuilder();

builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterModule(new LoggingModule());
builder.RegisterModule(new ServiceModule());

var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

app.UseAutofacMiddleware(container);
app.UseAutofacMvc();

Во время выполнения я получаю исключение о том, что ILogger не был зарегистрирован, я что-то упускаю из-за того, как работают модули, из-за чего ILogger не отображается в моем сервисном модуле?

1 ответ

Решение

Модуль может делать много вещей: он может регистрировать новые компоненты и / или подписываться на события Autofac.

В этом случае LoggingModule не регистрируется ILog, Он перехватывает подготовку других компонентов, используя Preparing событие и добавить новый Parameter это создаст ILog если нужно.

Вы не сможете решить ILog но если ваш AccountService реализация требует ILog следующие Parameter будет срабатывать и обеспечит ILog реализация.

new ResolvedParameter(
    (p, i) => p.ParameterType == typeof(ILog),
    (p, i) => LogManager.GetLogger(p.Member.DeclaringType)
)

Все, что вам нужно сделать, это зарегистрировать ваш тип, не пытаясь явно создать экземпляр:

builder.RegisterType<AccountService>()
       .As<IAccountService>()
       .InstancePerRequest();
Другие вопросы по тегам