すべきことは、MVC Dependency Resolver を呼び出して real をフェッチするだけの空のメンバーシップ プロバイダーを作成することですMembership Provider
。これを行うことで、次の 3 つのことが達成されます。
- この実装にはデフォルトのコンストラクターがあり、web.config で構成できます。
- 実装は MVC インフラストラクチャ コンポーネントであり、(おそらくテストしたい) 実装を含む実際のメンバーシップ プロバイダーから分離されています。
- このインフラストラクチャ コンポーネントは、Unity (またはその他のコンテナー) には依存せず、MVC3 のみに依存するため、コンテナー自体の結合が低下します。
実装は次のようになります。
public class DependencyResolverMembershipProvider : MembershipProvider
{
private static MembershipProvider Provider
{
get
{
var provider = DependencyResolver.Current.GetService<MembershipProvider>();
if (provider == null)
{
throw new InvalidOperationException(
"Make sure the MembershipProvider is registered.");
}
return provider;
}
}
public override string ApplicationName
{
get { return Provider.ApplicationName; }
set { Provider.ApplicationName = value; }
}
public override bool ChangePassword(string username,
string oldPassword, string newPassword)
{
return Provider.ChangePassword(username, oldPassword, newPassword);
}
public override bool ChangePasswordQuestionAndAnswer(string username,
string password, string newPasswordQuestion, string newPasswordAnswer)
{
return Provider.ChangePasswordQuestionAndAnswer(username,
password, newPasswordQuestion, newPasswordAnswer);
}
public override MembershipUser CreateUser(string username,
string password, string email, string passwordQuestion,
string passwordAnswer, bool isApproved, object providerUserKey,
out MembershipCreateStatus status)
{
return Provider.CreateUser(username, password, email,
passwordQuestion, passwordAnswer, isApproved, providerUserKey,
out status);
}
// Implement all other methods here
}
MembershipProvider
には多くのメソッドがあるため、これはまだ多くの作業です。これを簡単にする方法は 2 つあります。
- Griffin.MvcContribなどのフレームワークを使用します。これは、これらのクラス内にある責任を分離し、この機能のために実装できるいくつかの新しいインターフェイスを公開するため、すでにそのようなことを行い、より快適な方法でそれを行います。 .
- システムのどの部分も静的クラスに依存するのを防ぎます
Membership
が、常にMembershipProvider
これらのクラスに a を注入するか、さらに良い方法MembershipProvider
です。MembershipProvider
IUserRepository
IPasswordManager