3

MVC4 ソリューション用のカスタム メンバーシップ プロバイダーを作成しました。問題は、Unity を介して注入できないことです。

コンストラクター インジェクションを使用してみましたが、パラメーターのないコンストラクター エラーが発生します。InjectionProperty を使用しようとしても、プロパティは変更されません。DependencyResolver.Current.GetService(); を使用してみました。null を返します。

最初に web.config を介してプロバイダーをアタッチしました。

  <membership defaultProvider="ExtendedServiceMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear />
    <add name="ExtendedServiceMembershipProvider" type="Foo.Providers.Security.BoxMembershipProvider, Foo" />
  </providers>
</membership>
<roleManager defaultProvider="ExtendedServiceRoleProvider">
  <providers>
    <clear />
    <add name="ExtendedServiceRoleProvider" type="Foo.Providers.Security.BoxRoleProvider, Foo" />
  </providers>
</roleManager>

これは正しいアプローチですか?あなたの何人かが私の問題の解決策を持っていることを願っています.

ありがとう。

4

1 に答える 1

3

すべきことは、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です。MembershipProviderIUserRepositoryIPasswordManager
于 2013-03-14T14:59:01.803 に答える