18

MVC 3 で ninject を使用してカスタム メンバーシップ プロバイダーにリポジトリを注入しようとしています。

MembershipProvider では、次のことを試しました。

[Inject]
public ICustomerRepository _customerRepository{ get; set; }

[Inject]
public TUMembershipProvider(ICustomerRepository customerRepository)
{
    _customerRepository = customerRepository;
}

私のninjectモジュールでは、次のことを試しました:

Bind<MembershipProvider>().ToConstant(Membership.Provider);

上記のいずれも機能しません。

私が使用するとき(global.asaで)

kernel.Inject(Membership.Provider);

一緒に

[Inject]
public ICustomerRepository _customerRepository{ get; set; }

動作しますが、ライフサイクル管理がなく、NHibernate から「ISession が開いています」というエラーが発生します。これは、ISession が InRequestScope であり、リポジトリがそうでないためです。

4

4 に答える 4

5

@Remo Gloor がプロバイダー インジェクションに関する彼のブログ投稿で概説しているアプローチを使用できます。次の 3 つの手順が含まれます。

  1. 注入する必要があるプロバイダーのプロパティに s を追加[Inject]します (ただし、彼が示すパターン -- プロパティ注入の受け入れ可能な機能のみを持つ非常に単純なクラスを作成し、コンストラクター注入を使用して実装された実際のクラスにすべての要求を転送します -- は、従う価値がある)

    public class MyMembershipProvider : SqlMembershipProvider
    {
        [Inject]
        public SpecialUserProvider SpecialUserProvider { get;set;}
        ...
    
  2. IHttpModuleプロバイダーをプルしてその作成をトリガーするを実装するイニシャライザー ラッパーを作成します。

    public class ProviderInitializationHttpModule : IHttpModule
    {
        public ProviderInitializationHttpModule(MembershipProvider membershipProvider)
        {
        }
    ...
    
  3. を登録しIHttpModuleてくださいRegisterServices:-

    kernel.Bind<IHttpModule>().To<ProviderInitializationHttpModule>();
    
  4. 4 はありません。Ninject が残りIHttpModulesを行います - 追加したものを含むすべての登録済みのものを起動シーケンス中にブートストラップします)。

(ライフタイムなどに関するブログ投稿のコメントを読むことを忘れないでください。)


最後に、それをきちんと解決する完全に脳死した直接的なものを探している場合は、代わりにこの @Remo Gloor の回答を試してください。


PS全体の混乱に関する素晴らしい記事は、@Mark Seemann による Provider is not a Patternです。(そして、彼の優れた本の義務的なプラグイン:- .NET での依存関係の注入。これにより、第一原理からこの問題を簡単に理解できるようになります)

于 2012-05-01T07:34:11.163 に答える
1

問題は、Membership インフラストラクチャ全体が "ネイティブ" .NET コード (System.Web.Security) であり、MVC と MVC で使用される DI コンテナーを認識していないことです。Membership.Provider への静的呼び出しは、構成に基づいてメンバーシップ プロバイダーを返しますが、指定されたプロバイダーの種類は単純な Activator.CreateInstance 呼び出しでインスタンス化されます。したがって、依存性注入が開始され、リポジトリの依存性が結果に設定される可能性はありません。返されたインスタンスを Ninject で明示的に設定すると、依存関係を設定するオブジェクトを明示的に Ninject に指定したため、機能します。この場合でも、以前にメンバーシップ構成によってインスタンスが作成されているため、コンストラクター注入ではなく、プロパティ注入でのみ機能します。

要約すると、依存性注入コンテナーから解決されないため、メンバーシップ プロバイダーに依存性を簡単に注入することはできません。あなたには2つの可能性があると思います:

  1. カスタム メンバーシップ プロバイダーにリポジトリを直接作成するか、必要に応じて他の方法でリポジトリにアクセスします (Web コンテキストが既に存在する場合)。
  2. 1 つ上のレベルに移動して、メンバーシップ プロバイダーを使用するコンポーネントを確認し、そこで変更を試みます (初期化されていない Memership.Provider の代わりに、DI コンテナーから解決されたメンバーシップ プロバイダーを使用するため)。この「上位コンポーネント」がフォーム認証である場合、この記事が役立つ可能性があります (IFormsAuthentication および IMembershipService で依存性注入を使用): http://weblogs.asp.net/shijuvarghese/archive/2009/03/12/applying-依存関係の注入-asp-net-mvc-nerddinner-com-application.aspx
于 2011-06-05T21:07:48.480 に答える
0

この回答のように、リポジトリを「手動で」解決しようとしましたか: Ninject : Resolving an object by type _and_ registration name/identifier ?

于 2011-06-13T19:07:02.450 に答える