依存性注入とASP.Netメンバーシッププロバイダ
-
20-09-2019 - |
質問
私はASP.Net MVCのウェブサイトのためのカスタムメンバシッププロバイダを作成する過程でいます。プロバイダは、より大きなライブラリの一部として、別のクラスとして作成されています。それはXMLファイルまたはSQLデータベースの可能性として柔軟にバックエンドのデータストアが必要です。私の最初に考えたのは、データ・ストアのためのインタフェースを作成し、依存性注入を使用して、プロバイダにこれを注入することでした。
必要とされる最終的な結果は、開発者がデータストアインタフェースを継承した後、カスタムメンバシッププロバイダによって使用されるデータを更新するために必要なメソッドを提供することができることである。
しかし、スキルの私自身の不足によって、私は、ウェブサイトに追加する際にメンバーシッププロバイダーにクラスを注入する方法を見つけ出すことはできませんか?何がプロバイダにデータストアをリンクするために行われる必要がありますか?どのようなウェブサイトでこれを有効にする最も簡単な方法でしょうか?
解決
Web.configファイルで<会員>要素を介してカスタムメンバーシッププロバイダを設定している場合は、私はあなたが依存性注入となります問題を見ることができます。
プロバイダを構築し、フレームワークによって管理され、あなたが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()
は、フレームワークによって呼び出されます。
テストシナリオの場合は、あなただけの、プロバイダインスタンス自体にデータストアのプロパティを設定します。
他のヒント
これは良くありませんか?私はMVC3とninjectでそれを使用しています。それはあなたのカスタムメンバシッププロバイダクラスにプロパティを追加するだけで十分です。追加することを忘れないでください「System.Web.Mvcを使用して、」トップに。
public IRepository Repository
{
get
{
return DependencyResolver.Current.GetService<IRepository>();
}
}
依存関係の私が見てきた、注射(と私は、これまで使用してきた、実際に一つだけ...)最も簡単な方法は、パラメータとしてインターフェイスを取るあなたの依存クラスのコンストラクタを持って、それを割り当てることですプライベートフィールドへ。あなたがしたい場合は、そのチェーンのデフォルト値を持つ最初の一つに、「デフォルト」のコンストラクタを追加することができます。
簡体字、それは次のようになります
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()) { }
}
コンセプトは「コンストラクタチェーン」と呼ばれ、それを行う方法については、ウェブ上の記事の多くがありますされています。私はこのチュートリアルDIパターンの非常に説明を見つけます。