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();