Autofac: как передать параметр конструктора для регистрации экземпляра в качестве компонента - PullRequest
0 голосов
/ 05 сентября 2018

В моем проекте есть класс обслуживания, и я ввел свой класс контекста (ClientIntagrationContext) в конструктор класса обслуживания для извлечения данных из БД во время выполнения, как показано ниже.

 public AppLogsDataWriterService(AppLogsDbConnectionFactory dbFactory, IClientIntagrationContext clientIntagrationContext)  
    {
        this.dbFactory = dbFactory;
        this.clientIntagrationContext = clientIntagrationContext;

        LogLevelThresholdValue = clientIntagrationContext.getApplogSettingsValue().ToString();
    }   

И при разрешении класса обслуживания (AppLogsDataWriterService) в файле Startup.cs мне нужно передать экземпляр класса ClientIntagrationContext в качестве параметра конструктору AppLogsDataWriterService, и я попытался создать конструктор по умолчанию, но он выдает исключение NullReference для Контекст БД. Так как передать параметр при регистрации в моем классе инъекций?

регистрация класса в Startup.cs,

 ...
 //IClientIntagrationContext clientIntegrationContext = new ClientIntagrationContext();
        IAppLogsDataWriterService logWriterService = new AppLogsDataWriterService(logDbfactory, _________________?);
        builder.RegisterInstance(logDbfactory);
        builder.RegisterInstance(logWriterService);


        builder.RegisterType<PlatformUserIdProvider>().As<IUserIdProvider>();
        builder.RegisterHubs(typeof(UserNotificationsHub).Assembly);
        var logLevelThreshold = RuntimeConfig.LogLevelThreshold;
        var infoLevel = string.IsNullOrEmpty(logLevelThreshold) ? Level.Info : Level.All.Parse(logLevelThreshold);
        var logWriter = RuntimeConfig.GetConfigValue<bool>("In8.Common.Logging.UseDirectWriter") ? (ILogWriter)new SqlWriter(logWriterService) : new WebWriter();
        builder.RegisterAndSetupLog4NetAppLogsForWebWriter("Core", logWriter: logWriter, threshold: infoLevel); 

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Мы можем мгновенно создать новый экземпляр для класса параметров и передать экземпляр в качестве параметра во время выполнения.

 Ex:  var parameter= new ClientIntegrationsLogService(anyParameterInstance);

Итак, я изменил свой код, как показано ниже, он работает нормально.

IExtClientIntegrationsContext iext = new ExtClientIntegrationsContext(TenantInfo.GetTenantInfoForRequest());
        IClientIntegrationsLogService clientIntegrationContext = new ClientIntegrationsLogService(iext);
        IAppLogsDataWriterService logWriterService = new AppLogsDataWriterService(logDbfactory, clientIntegrationContext, TenantInfo.GetTenantInfoForRequest());

Или же мы можем создать новый экземпляр для класса обслуживания в классе "AppLogsDataWriterService". Для этого подхода не нужно разрешать или регистрировать наш класс обслуживания.

Ex:
private readonly ClientIntegrationsLogService clientIntegrationsLogService;

Constructor()
{
  clientIntegrationsLogService = new ClientIntegrationsLogService(new 
  ExtClientIntegrationsContext(tenant));
}
0 голосов
/ 05 сентября 2018

Вы можете использовать ContainerBuilder.Register для разрешения зависимости во время создания службы.

Например:

builder.RegisterType<ClientIntegrationContext>().As<IClientIntegrationContext>();
builder.Register(x => new AppLogsDataWriterService(logDbfactory, x.Resolve<IClientIntegrationContext>()).AsSelf();
...