Должен ли я использовать InSingletonScope при привязке MemberhipProvider в NInject?

Я новичок в привязке NInject, и вот что описывает NInject.

  • TransientBehavior. Новый экземпляр типа будет создан каждый раз, когда запрашивается.
  • SingletonBehavior. Только один экземпляр этого типа будет создан, и тот же экземпляр будет возвращен для каждого последующего запроса.
  • OnePerThreadBehavior. Один экземпляр этого типа будет создан для каждого потока.
  • OnePerRequestBehavior. Один экземпляр этого типа будет создан для каждого веб-запроса и будет уничтожен при завершении запроса.

Если я хочу привязать MembershipProvider к SqlMembershipProvider, должен ли я использовать SingletonBehavior, так как мне нужен только один поставщик членства в sql?

Ответ 1

ASP.Net уже предоставляет статический экземпляр текущего поставщика членства через статический класс Членство и его статическое свойство Поставщик. Связывание, вероятно, будет в вашем методе Application_Start и выглядеть примерно так:

Bind<MembershipProvider>()
  .ToMethod(ctx => Membership.Provider);

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

Не указывая какое-либо поведение в приведенном выше фрагменте, Ninject по умолчанию будет иметь переходное поведение. В этом виде привязки я полагаю, что это будет означать вызов лямбда, который возвращает Membership.Provider каждый раз, когда ему нужно ввести тип MembershipProvider.

Я полагаю, что может существовать аргумент для явного указания одноэлементного поведения, поскольку Ninject, скорее всего, "кэширует" значение, возвращаемое лямбдой, в первый раз, когда ему нужно ввести MembershipProvider, фактически сохраняя накладные расходы на выполнение лямбда. Я не уверен на 100%, что Ninject будет работать в этой ситуации, но кажется разумным, что это будет.

Все, что сказал, мое личное предпочтение было бы использовать OnePerRequestBehavior, таким образом, я знаю, что Ninject будет вызывать мою лямбду один раз для каждого запроса. Не уверен, что это необходимо, но мне нравится идея получить провайдера из Membership.Provider после каждого запроса, так как я полагаю, вы не можете делать предположения о том, как и когда Membership.Provider get set, хотя вы, вероятно, можете узнать, достаточно ли вы выкапываете Reflector.

Bind<MembershipProvider>()
  .ToMethod(ctx => Membership.Provider)
  .Using<OnePerRequestBehavior>();

Удачи. Извините, ваш вопрос сидел здесь так долго!