Ninject InSingletonScope вставляет один параметр в каждый запрос - PullRequest
0 голосов
/ 20 мая 2018

Я использую Ninject

У меня есть класс, который я использую для хранения и построения некоторых кэшированных данных, если это необходимо.Он настроен в моей привязке Niject следующим образом:

    kernel.Bind<IConsistencyCheckCacheHelper>().To<ConsistencyCheckCacheHelper>().InSingletonScope();

Класс имеет некоторые необходимые зависимости, внедренные в него при первом создании класса, затем каждый раз вводится тот же самый экземпляр.

Но в случае, когда необходимо перестроить данные, мне нужно внедрить зависимость времени выполнения.

Я использую это как кеш приложения,

Есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

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

Класс был зарегистрирован в Ninject каксинглтон.Это означает, что в первый раз, когда Ninject разрешит IConsistencyCheckCacheHelper, он создаст экземпляр ConsistencyCheckCacheHelper, а затем снова и снова будет использовать тот же экземпляр.

Таким образом, Ninject не внедряет один и тот же экземплярзависимости в ConsistencyCheckCacheHelper снова и снова.Он создает только один экземпляр ConsistencyCheckCacheHelper, поэтому любой экземпляр зависимости, в который он вставлен, также не изменится.

Если вы хотите, чтобы зависимость внутри используемой ConsistencyCheckCacheHelper изменялась каждый раз, когда она разрешается, вы не можете зарегистрировать ее как одиночную.Вам нужно будет использовать другую область.

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

.InRequestScope() означает, что для каждого веб-запроса создается новый экземпляр.

Это все еще немного сложнее, чем это.Например, если ConsistencyCheckCacheHelper зарегистрирован как переходный процесс, каждый раз создается новый экземпляр.Но если от чего-то еще зависит и , что зависимость регистрируется как одноэлементная, каждый новый экземпляр ConsistencyCheckCacheHelper будет получать один и тот же экземпляр этой зависимости.

Часто рекомендуетсяначать с переходных зависимостей.Если нам не нужно повторно использовать экземпляр, стоимость создания новых объектов, вероятно, не так велика.Для веб-приложения InRequestScope, скорее всего, безопасно.Я бы использовал только одноэлементную область видимости, если я уверен, что смогу безопасно повторно использовать один экземпляр этого класса вместе с одним экземпляром, если его зависимости и их зависимости и т. Д.

Ninject предметные области

0 голосов
/ 20 мая 2018

Возможно, это не лучший способ сделать это, но он работает, создайте 2 интерфейса, которые представляют один и тот же класс

public interface DepInterfaceOne
{
    int MethodWithCachedData();

    void InfoRequiredForAtRunTime(object RunTimeObject);
}

public interface DepInterfaceTwo: IConsistencyCheckCacheHelper
{

}

И настройте привязку таким образом

         kernel.Bind<DepInterfaceOne>().To<DepInterfaceOneClass>().InSingletonScope();

        kernel.Bind<DepInterfaceOneTwo>().ToMethod(a =>
        {
            DepInterfaceOne toReturn = kernel.Get<DepInterfaceOne>();
            toReturn.InfoRequiredForAtRunTime(HttpContext.Current.Session["InfoRequired"]);
            return toReturn;
        });
...