34

ASP.NetMVCWebサイトのカスタムメンバーシッププロバイダーを作成中です。プロバイダーは、より大きなライブラリの一部として別個のクラスとして作成されています。XmlファイルまたはSQLデータベースである可能性があるため、バックエンドデータストアは柔軟である必要があります。私の最初の考えは、データストアのインターフェイスを作成し、依存性注入を使用してこれをプロバイダーに注入することでした。

最終的に必要なのは、開発者がデータストアインターフェイスを継承し、データを更新するために必要なメソッドを提供できることです。このメソッドは、カスタムメンバーシッププロバイダーによって使用されます。

しかし、私自身のスキルの欠如により、クラスをWebサイトに追加するときに、クラスをメンバーシッププロバイダーに注入する方法がわかりません。データストアをプロバイダーにリンクするには何をする必要がありますか?ウェブサイトでこれを有効にする最も簡単な方法は何でしょうか?

4

3 に答える 3

33

Web.configファイルの<membership>要素を介してカスタムメンバーシッププロバイダーを構成している場合、依存性注入で発生する問題を確認できます。

プロバイダーはフレームワークによって構築および管理され、IDataStoreインターフェースに追加の依存性注入を提供するためにその構築をインターセプトする機会はありません。

私の仮定が正しければ、あなたができることはInitialize()、カスタムプロバイダーのメソッドをオーバーライドし、そこで依存性注入を行うことです。IDataStoreディクショナリの一部としてメソッドに渡される、を実装するタイプを指すカスタムの名前/値設定をプロバイダー構成に含めることができますInitialize()

次に、データストアタイプのインスタンスをアクティブ化し、適切なプロパティに設定します。

public class MyMembershipProvider : MembershipProvider
{
    public IDataStore DataStore
    {
        get;
        set;
    }

    public override Initialize(string name, NameValueCollection config)
    {
        var dataStoreType = config["dataStoreProvider"];
        if (!String.IsNullOrEmpty(dataStoreType))
        {
            var type = Type.GetType(dataStoreType);
            DataStore = (IDataStore) Activator.CreateInstance(type);
        }
    }
}

Initialize()フレームワークがプロバイダーのインスタンスを構築した後にフレームワークによって呼び出されるため、このような追加のセットアップ作業を行うのに最適な場所です。

テストシナリオでは、テストで直接構築するため、プロバイダーインスタンス自体にデータストアプロパティを設定するだけです。

于 2009-10-12T00:02:43.023 に答える
20

これは良くないですか?私はMVC3とninjectでそれを使用します。カスタムメンバーシッププロバイダークラスにプロパティを追加するだけで十分です。「usingSystem.Web.Mvc;」を追加することを忘れないでください。上に。

public IRepository Repository
{
    get
    {
        return DependencyResolver.Current.GetService<IRepository>();
    }
}
于 2011-12-04T10:22:22.253 に答える
2

私が見た依存性注入を行う最も簡単な方法(そして実際にこれまでに使用した唯一の方法...)は、依存クラスのコンストラクターにインターフェースをパラメーターとして取り、それをプライベートに割り当てることです。分野。必要に応じて、「デフォルト」コンストラクターを追加することもできます。このコンストラクターは、デフォルト値で最初のコンストラクターにチェーンされます。

簡略化すると、次のようになります。

public class DependentClass
{
    private IDataStore _store;

    // Use this constructor when you want strict control of the implementation
    public DependentClass(IDataStore store)
    {
         this._store = store;
    }

    // Use this constructor when you don't want to create an IDataStore instance
    // manually every time you create a DependentClass instance
    public DependentClass() : this(new DefaultDataStore()) { }
}

この概念は「コンストラクター連鎖」と呼ばれ、その方法に関する記事がWeb上にたくさんあります。このチュートリアルは、DIパターンを非常によく説明していると思います。

于 2009-10-11T23:32:32.503 に答える