Ответ 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>();
Удачи. Извините, ваш вопрос сидел здесь так долго!