3

この記事の説明によると、custom-membership-provider-with-repository-injection

injectで提供するカスタムメンバーシップを実装します。

カスタムメンバーシッププロバイダー

using Ninject;

public class CustomMembershipProvider : MembershipProvider
{
        [Inject]
        public IUserRepository UserRepository { get; set; }

[...]

カスタムロールプロバイダー

using Ninject;

public class CustomRoleProvider : RoleProvider
{
      [Inject]
      public IUserRoleRepository UserRoleRepository { get; set; }
[...]

Web.Config

<membership defaultProvider="CustomsMembershipProvider">
      <providers>
        <clear/>
        <add name="CustomsMembershipProvider" type="namespace.CustomsMembershipProvider"/>
      </providers>
</membership>
<roleManager enabled="true" defaultProvider="customRoleProvider">
      <providers>
        <clear/>
        <add name="customRoleProvider" type="namespace.customRoleProvider"/>
      </providers>
</roleManager>

NinjectWebCommon内になりました

private static IKernel CreateKernel()
{
      var kernel = new StandardKernel();
      kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

      RegisterServices(kernel);
      return kernel;
}

private static void RegisterServices(IKernel kernel)
{
  [...]

  kernel.Bind<IUserRepository>().To<UserRepository>();
  kernel.Bind<IUserRoleRepository>().To<UserRoleRepository>();

  // Inject user & role repository into our custom membership & role providers.
   kernel.Inject(Membership.Provider);
   kernel.Inject(Roles.Provider);
}

アプリケーションを実行するとエラーが発生しました

このメソッドは、アプリケーションの開始前の初期化段階では呼び出すことができません。

kernel.Inject(Membership.Provider);この行から

しかし、カーネル設定をApplication_Start内に配置した場合

次のエラーが発生しました

IUserRepositoryのアクティブ化中にエラーが発生しました一致するバインディングが利用できず、タイプは自己バインドできません。アクティベーションパス:2)CustomMembershipProviderタイプのプロパティUserRepositoryへの依存性IUserRepositoryの注入1)CustomeMembershipProviderのリクエスト

それを解決する方法。??

4

3 に答える 3

8

結果は常に null です。なぜ?asp.net にはメンバーシップ用の独自の静的プロパティがあるためです。

これはmembership.providerです。このインスタンスは、インスタンス ninject 管理の一部ではありません。

これを回避するには、kernel.inject を使用する必要があります。しかし、aspnetmvc.cs を生成すると、PreApplicationStart イベントに挿入され、許可されないことがわかります。

これが、私の問題を解決するciptoによる解決策です。これを NinjectWebCommon に追加します

    [assembly: WebActivator.PreApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Start")]
    [assembly: WebActivator.PostApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "RegisterMembership")]
    [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Stop")]

    public static void RegisterMembership()
    {
        bootstrapper.Kernel.Inject(Membership.Provider);
    } 

記事へのリンク: Ninject と customMembership asp.net mvc 3

于 2013-04-20T14:48:09.760 に答える
2

これを試すのに多くの問題があり、リポジトリを取得するメソッドを追加することになりました

using System.Web.Mvc;  //Used to access dependency resolver

    private IUserRepository GetUserRepository()
    {
        return DependencyResolver.Current.GetService<IUserRepository>();
    }

次に、これを必要とするメソッドでこれを呼び出します

コンストラクタインジェクションを使用してリポジトリをインジェクションすることができましたが、リポジトリを使用するとすぐにオブジェクトが破棄されました。上記が最も簡単な代替手段であることがわかりました。

Initialize()ただし、この方法も使用できると思います

    IUserRepository userRepository;
    public override void Initialize(string name, NameValueCollection config)
    {
        base.Initialize(name, config);
        this.userRepository = DependencyResolver.Current.GetService<IUserRepository>();
    }

または別の方法は、プロパティを使用することです

public IUserRepository UserRepository
{
    get
    {
        return DependencyResolver.Current.GetService<IUserRepository>();
    }
}
于 2013-01-19T07:51:25.127 に答える
1

customRoleProviderは custom と一緒に来ることが多いためMembershipProvider、その場合は Role Provider クラスのインジェクションを追加すると便利です。追加の行でramon22のソリューションを使用しました。

[assembly: WebActivator.PreApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Start")]
[assembly: WebActivator.PostApplicationStartMethod(typeof(TopRankFantasy.App_Start.NinjectMVC3), "RegisterMembership")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(TopRankFantasy.App_Start.NinjectMVC3), "Stop")]

public static void RegisterMembership()
{
    bootstrapper.Kernel.Inject(Membership.Provider);
    bootstrapper.Kernel.Inject(Roles.Provider);
} 
于 2014-10-10T08:57:27.820 に答える