11

カスタム メンバーシップ プロバイダーを実装する ASP.NET MVC Web アプリケーションがあります。カスタム メンバーシップ プロバイダーはUserRepository、メンバーシップ プロバイダーと NHibernate の間のインターフェイスを提供するコンストラクターに を受け取ります。これUserRepositoryは Ninject IoC コンテナーによって提供されます。

ただし、明らかに、プロバイダーが .NET によってインスタンス化されている場合、これは機能しません。パラメーターなしのコンストラクターには UserRepository がなく、作成できません (UserRepository では、コンストラクターに NHibernate セッションを渡す必要があります)。データ ストアにアクセスできません。オブジェクトの依存関係を解決するにはどうすればよいですか?

これは既存のアプリケーションを Ninject で改良したものであることに注意してください。以前は、単体テストを支援するために、パラメーター付きコンストラクターと組み合わせて必要な依存関係を作成できるパラメーターなしコンストラクターを使用していました。

何か考えはありますか?

4

4 に答える 4

5

Michael B. からの正解:依存性注入と ASP.Net メンバーシップ プロバイダー

次の方法で、リポジトリ (またはサービス) インジェクションを取得できます。

public IRepository Repository { get { return DependencyResolver.Current.GetService(IRepository ); } }
于 2012-12-12T12:05:17.943 に答える
5

Ninject を使用して必要なリポジトリを初期化する、パラメーターなしのコンストラクターを保持したい場合があります。Common Service Locatorを使用したい場合があるため、Ninject への参照もカスタム プロバイダー内のコンテナーも必要ありません。Ninject には CSL 用の公式のアダプター実装がないようですが、それを書くのは難しくないはずです (Windsor のような他の実装を確認してください)。どこかに非公式の実装があると確信しています。

于 2010-05-02T14:18:01.797 に答える
4

メンバーシップ コレクションと MemberShip.Provider インスタンスは、Ninject がインスタンス化する前に作成されるため、オブジェクトに対して作成後のアクティベーションを実行する必要があります。依存関係をプロバイダー クラスのプロパティに [Inject] でマークすると、kernel.Inject(MemberShip.Provider) を呼び出すことができます。これにより、すべての依存関係がプロパティに割り当てられます。

于 2010-11-08T13:46:04.083 に答える
-1

私は同じ問題を抱えていました。認証チケットを使用して必要なデータをIDオブジェクトに渡すことで解決しました。

その後、メンバーシップ プロバイダーにオブジェクトを挿入する必要はありません。

私の認証コードには

    [NonAction]
    private void SetAuthTicket(Member member, bool isPersistent)
    {
        HttpCookie cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName);

        FormsAuthentication.SetAuthCookie(member.Email, isPersistent);

        string userData = "|" + member.ID + "|" + member.Firstname + "|" + member.Lastname + member.Culture;

        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, member.Email, DateTime.UtcNow, DateTime.UtcNow.AddDays(7), isPersistent, userData);

        string encryptedTicket = FormsAuthentication.Encrypt(ticket);
        cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
        Response.Cookies.Add(cookie);
    }

そしてGlobal.asaxで

    void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
    {
        IPrincipal user = HttpContext.Current.User;
        if (user.Identity.IsAuthenticated && user.Identity.AuthenticationType == "Forms")
        {
            FormsIdentity identity = user.Identity as FormsIdentity;

            MyIdentity ai = new MyIdentity(identity.Ticket);            
            MyPrincipal p = new MyPrincipal(ai);

            HttpContext.Current.User = p;
            System.Threading.Thread.CurrentPrincipal = p;

            if (!String.IsNullOrEmpty(ai.Culture))
            {
                CultureInfo ci = new CultureInfo(ai.Culture);
                System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
                System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
            }
        }
    }

Identity クラスには、チケット文字列の一部を返す MemberName、Firstname、および Lastname プロパティがあります。

于 2010-05-02T12:24:13.470 に答える