2012-02-09 6 views
1

NinjectMVC3.csを使用してカスタムメンバーシッププロバイダクラスを挿入する方法を知っている人はいますか?私はグーグルで試してみて、すべての実装を試してみましたが、どれも動作しません。誰もこれをやっていますか?私はプロパティ属性[Inject]を使って注入しようとしましたが、コンストラクタインジェクションが動作しないので、他の方法はわかりません。このNinjectMVC3 2.2.00とメンバーシッププロバイダ

なしに動作しません:カスタムメンバシッププロバイダを注入する

public class AccountMembershipProvider : MembershipProvider 
[Inject] 
protected IAccountRepository accountRepository { get; set; } 

//NinjectMVC.cs RegisterServices 
kernel.Bind<IAccountRepository>().To<AccountRepository>(); 
kernel.Bind<MembershipProvider>().ToProvider<AccountMembershipProvider>(); 

public class AccountMembershipProvider : MembershipProvider 
[Inject] 
protected IAccountRepository accountRepository { get; set; } 

//NinjectMVC.cs RegisterServices 
kernel.Bind<IAccountRepository>().To<AccountRepository>(); 
kernel.Bind<MembershipProvider>().ToMethod(ctx=>Membership.Provider); 

完全な例がいいだろう。

+0

私はあなたのコントローラにメンバシッププロバイダオブジェクトしようとしている程度の結束が、どのように使うの持っているものです。次に、コンストラクタインジェクションを介して、リポジトリをメンバシッププロバイダに注入することができます。 –

+0

カスタムメンバシッププロバイダに依存せずにMembership.CreateUser(..)を記述できるようにしたいということを除いて、私はそのことについて考えました。私はカスタムメンバーシッププロバイダ内のリポジトリを使用しています。メンバーシッププロバイダはWebコンフィグレーション経由で設定されています。私がコントローラにメンバーシップを注入しようとするなら、私は準備ができているASPNETメンバーシッププロバイダを使用することさえできません。 DIを使用したMS Provider Modelを使用した頭痛の価値はほとんどありません。返事をありがとう、私はそれを感謝します。 – Fab

+0

私は昨夜、プロバイダーで解決するための別のテクニックを読んで興味深い記事を書いています - http://stackoverflow.com/questions/4193484/how-do-i-control-membershipprovider-instance-creation-lifetime以下のRemoと全く同じことです。Castle Windsorを使用するだけです。http://bugsquash.blogspot.com/2010/11/windsor-managed-membershipproviders.html –

答えて

0

Ninjectの3.0.0は、それは私がIAccountRepositoryバインディングに.InRequestScopeを追加しましたので、コンテキストがエラーを配置したきたが、カスタムメンバシッププロバイダによって使用されIRepositoryをインスタンス化作品。バインディングが正しいかどうか確認できますか?私はIAccountリポジトリでInRequestScopeを使用する必要がありますか、またはHttpModuleにいくつかのコードを実装する必要がありますか?ここで

は私が

//custom membership provider 
public class AccountMembershipProvider : MembershipProvider 
{ 
    [Inject] 
    public IAccountRepository accountRepository 
    { 
     get; 
     set; 
    } 
//example method 
public override int GetNumberOfUsersOnline() 
    {   
     return this.accountRepository.TotalUsers; 
    } 


//AccountRepository 
public class AccountRepository : IAccountRepository 
{ 
    private EFDbContext context; 

    public AccountRepository(EFDbContext dbContext) 
    { 
     this.context = dbContext; 
    } 

public int TotalUsers 
    { 
     get { return this.context.Users.Count(); } 
    } 


//HttpModule Do I need to implement anything here ??? 
public class ProviderInitializationHttpModule : IHttpModule 
{ 
    public ProviderInitializationHttpModule(MembershipProvider membershipProvider){} 
    public void Init(HttpApplication context){} 
    public void Dispose{}   
} 


//NinjectWebCommon.cs RegisterServices 
//dbContext bindings 
kernel.Bind<EFDbContext>().ToSelf().InRequestScope(); 
kernel.Bind<IDbContext>().ToMethod(ctx => ctx.Kernel.Get<EFDbContext>()); 
kernel.Bind<DbContext>().ToMethod(ctx => ctx.Kernel.Get<EFDbContext>()); 

//Repository - I had to add .InRequestScope so the Memeberhip Provider doesn't 
//dispose the dbcontext. I believe this is because of the HttpModule disposing 
kernel.Bind<IAccountRepository>().To<AccountRepository>().InRequestScope();** 

//Custom Membership implemented using the Repository Pattern 
kernel.Bind<MembershipProvider>().ToMethod(ctx=>Membership.Provider); 
kernel.Bind<IHttpModule>().To<ProviderInitializationHttpModule>(); 
+1

Membership.Providerはシングルトンです。それは要求よりもはるかに長いライフサイクルを持っています。したがって、要求スコープの依存関係に依存してはいけません。死んだオブジェクトを参照することになります。リポジトリのスコープは、dbコンテキストの廃棄を変更しません。今は両方が処分されています。リポジトリそのものではなく、すべてのユーザ検証のためにリポジトリを再作成するための作業を行うのが最善です。参照:http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/プロバイダーがアカウントエンティティ上で唯一の操作である場合、シングルトンスコープが代わりに機能する可能性があります。 –

+0

私の他のコメントについては忘れて、私は本当に混乱していた。私はもう少し工場の方法を試してみるつもりです。私は、他のデータベースのエンティティフレームワークのサポートを完全に忘れていました。私は、テストとDIのためのインターフェイスを使用していることを覚えているのではなく、リポジトリを使ってエンティティフレームワークをコーディングしようとしていました。うわー、このことはしばらくすると混乱します。 – Fab

+0

私はプロジェクトを再作成しましたが、何らかの理由で私が昨日持っていた問題を再現することができません。 InRequestScopeを使用せずに、上記のコードをすべて正確に使用しています。おそらく私はまだ古いNinject DLLを参照していました。 – Fab

関連する問題