2009-06-28 5 views
10

Я довольно новичок в привязке NInject, и вот что описывает NInject.Должен ли я использовать InSingletonScope при привязке MembershipProvider в NInject?

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

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

+0

См. Также: http://stackoverflow.com/questions/2753424 –

ответ

13

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

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

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

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

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

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

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

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

+0

спасибо, меня просто беспокоило, если пользователь выходит из системы и кто-то еще входит в систему, Ninject не будет удерживать предыдущего пользователя. Не могли бы вы подтвердить? – Haroon