2

В основном я использовал Ninject, поэтому извиняюсь, если я перепутаю терминологию.Регистрация модуля Autofac

Я создал модуль журнала для обработки 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(); 
    } 
} 

Вот мой autofac регистрация:

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 не будет отображаться в моем сервисном модуле?

ответ

2

Модуль может выполнять множество функций: он может регистрировать новые компоненты и/или подписаться на 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(); 
+0

Ok, что имеет смысл, так как я попытался изменить свою регистрацию на тип регистрации и она работает. Как я могу заставить модуль работать с заявлениями о разрешении, любую документацию, на которую вы можете указать мне эту тему? – Dan

+0

Взгляните на 'IRegistrationSource': http://docs.autofac.org/en/latest/advanced/registration-sources.html –

+0

Спасибо, что должно работать – Dan

 Смежные вопросы

  • Нет связанных вопросов^_^