0

カスタムメンバーシップとロールプロバイダーを備えたMVCアプリがあります。ユーザーが次のような役割を果たしているかどうかを確認しています。

public static bool CustomersVisible
{
    get
    {
        return
            HttpContext.Current.User != null &&
            HttpContext.Current.User.Identity.IsAuthenticated &&
            HttpContext.Current.User.IsInRole("Admin");
    }
}

カスタムロールプロバイダーは次のようになります。

public class DRRoleProvider : RoleProvider
{
    private IUserProfileRepository _userProfileRepository;
    private IRoleRepository _roleRepository;

    public DRRoleProvider() {}

    public DRRoleProvider(IUserProfileRepository userProfileRepository, IRoleRepository roleRepository)
    {
        _userProfileRepository = userProfileRepository;
        _roleRepository = roleRepository;
    }

. . .

public override bool IsUserInRole(string username, string roleName)
{
    var user = _userProfileRepository.GetByUserName(username);
    var role = _roleRepository.GetByName(roleName);

    if (user != null)
    {
        return user.Roles != null && user.Roles.Contains(role);
    }

    return false;
}

追加するために編集:これが私のNinjectControllerFactoryです:

public class NinjectControllerFactory : DefaultControllerFactory
{
    private IKernel ninjectKernel;

    public NinjectControllerFactory()
    {
        ninjectKernel = new StandardKernel();
        AddBindings();
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return controllerType == null
                   ? null
                   : (IController) ninjectKernel.Get(controllerType);
    }

    private void AddBindings()
    {
        ninjectKernel.Bind<ICustomerRepository>().To<CustomerRepository>();
        ninjectKernel.Bind<IUserProfileRepository>().To<UserProfileRepository>();
        ninjectKernel.Bind<IRoleRepository>().To<RoleRepository>();
        ninjectKernel.Bind<ISessionFactory>().ToProvider<SessionFactoryBuilder>().InSingletonScope();
        ninjectKernel.Bind<ISession>().ToMethod(CreateSession).InSingletonScope();

        ninjectKernel.Inject(Membership.Provider);
        ninjectKernel.Inject(Roles.Provider);
    }

    private ISession CreateSession(IContext context)
    {
        var session = context.Kernel.Get<ISessionFactory>().OpenSession();
        return session;
    }
}

IsUserInRoleメソッドが呼び出されると、_userProfileRepositoryでnull参照例外が発生します。HttpContext.Current.User.IsInRoleから呼び出されたときに、リポジトリが確実に挿入されるようにするにはどうすればよいですか?私自身のコードから呼び出された場合は正常に動作します。

4

1 に答える 1

1

RoleProviderは、実際には依存性注入に適していません。デフォルトのコンストラクターが必要です。代わりにプロパティインジェクションを使用してみてください。


Ninjectを使用しているので、おそらくこれらの質問/回答が役立つ可能性があります。RoleProviderDIninject
スローエラーを使用するカスタムロールプロバイダー

于 2012-06-29T00:52:33.397 に答える