Внедрение зависимостей в конструктор инициализирует службу - PullRequest
0 голосов
/ 22 октября 2018

Я использую Autofac .

  builder.RegisterType<LogHelper>().As<ILogger>().InstancePerLifetimeScope();

Я регистрирую услугу как InstancePerLifetimeScope.Таким образом, только один экземпляр создается в одной области действия Lifetime.

using (var container = Container.BeginLifetimeScope())
                {
var logger = container.Resolve<ILogger>();
                    var logge1r = container.Resolve<ILogger>();
                    var logger1 = container.Resolve<ILogger>();
 var repobackup = container.Resolve<IRepoBackup>();
                    repobackup.StartProcess();
                }

Эти два разрешения дают мне один и тот же экземпляр.

 var logger1 = container.Resolve<ILogger>();
 var logger2 = container.Resolve<ILogger>();

Некоторым службам этот сервис требовался путем внедрения зависимостей.

var repobackup = container.Resolve<IRepoBackup>();

эта строка выше инициализирует класс RepoBackupImplemetaion, для которого требуется экземпляр ILogger, но, поскольку это разрешение находится в том же LifeTimeScope, необходимо передавать тот же экземпляр, но новый экземпляр создается каждый раз, когда вызывается конструктор с этой зависимостью.

 internal class RepoBackupImplemetaion : IRepoBackup
    {
        public RepoBackupImplemetaion(ILogger logger)
        {
            LogHelper = logger;
      }
    }

Я зарегистрировал эту услугу как InstancePerLifetimeScope.

Я что-то упустил?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

InstancePerLifetimeScope () создает экземпляры для каждой вложенной области жизни.По этой причине, когда вы вызываете ваш конструктор каждый раз, когда он создает разные экземпляры.Причина в том, что область действия также различна для каждого звонка.

Вы должны использовать один экземпляр для обслуживания встречи.потому что он возвращает один экземпляр из всех запросов в корне и всех вложенных областей.

builder.RegisterType<LogHelper>().As<ILogger>().SingleInstance();

проверьте эту ссылку, чтобы получить дополнительную информацию:

https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html#instance-per-lifetime-scope

Спасибо.

0 голосов
/ 22 октября 2018

Оказывается, служба LogHelper также используется службой, которая установлена ​​как SingleInstance ().Для этого создается новый экземпляр для SingleInstance ().Я изменил SingleInstance на InstancePerLifetimeScope, и теперь он работает нормально.

0 голосов
/ 22 октября 2018

Это означает, что где-то в вашем коде создается новая область видимости.

Вы можете использовать SingleInstance() вместо InstancePerLifetimeScope(), если единственная проблема связана с наличием только одного экземпляра интерфейса ILogger.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...