使用Ninject与在MVC3应用自定义角色提供商 [英] Using Ninject with a Custom Role provider in an MVC3 app

查看:80
本文介绍了使用Ninject与在MVC3应用自定义角色提供商的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在MVC3应用程序使用自定义角色提供程序。我已经得到了成员资格提供工作确定使用Ninject,但似乎无法得到角色提供工作。成员资格提供不需要参数的构造函数,但角色提供一样。下面是一些code片段:

I'm trying to use a custom role provider in an MVC3 app. I've already got the membership provider working ok using Ninject but can't seem to get the role provider working. The Membership provider doesn't require a parameterless constructor but role provider does. Here's some code snippets:

的Web.config


      
    

<membership>
  <providers>
    <clear/>
    <add name="MyMembershipProvider" type="MyApp.Models.NHibernateMembershipProvider" 
         applicationName="myApp" />
  </providers>
</membership>

<roleManager enabled="true">
  <providers>
    <add name="MyRolesProvider" type="MyApp.Models.NHibernateRoleProvider"
         applicationName="myApp" />
  </providers>
</roleManager>

我有一个Ninject模块。

I have a Ninject module.

public class MyNinjectModule : NinjectModule
{
    public override void Load()
    {
        this.Bind<ISession>().ToMethod(
            x => MyApp.MvcApplication.SessionFactoryData.GetCurrentSession());

        // Respository
        this.Bind<IUserRepository>().To<UserRepository>();
        this.Bind<MembershipProvider>().To<NHibernateMembershipProvider>();
        this.Bind<RoleProvider>().To<NHibernateRoleProvider>();
    }
}

自定义成员资格提供

The custom Membership provider

public class NHibernateMembershipProvider : MembershipProvider
{
    private IUserRepository _repo;

    public NHibernateMembershipProvider(IUserRepository repository)
    {
        _repo = repository;
    }
    ...

角色提供

public class NHibernateRoleProvider : RoleProvider
{

    private IUserRepository _repo;

    public NHibernateRoleProvider(IUserRepository repository)
    {
        _repo = repository;
    }
    ...

然后我配置我的控制器需要授权

I then configure my controller to require an authorize

    [Authorize(Roles="Admin")]
    public ActionResult Edit(int? id)
    {
       ...

我开始应用程序时出现此错误。

I get this error when starting the app.

Parser Error Message: No parameterless constructor defined for this object.

Source Error: 


Line 49:     <roleManager enabled="true">
Line 50:       <providers>
Line 51:         <add name="MyRolesProvider" type="MyApp.Models.NHibernateRoleProvider"
Line 52:              applicationName="myApp" />
Line 53:       </providers>

我可以通过成员资格提供程序访问用户,这样仓库被注入确定,但角色提供商似乎有所不同。为什么角色提供需要一个构造函数参数少?有一个简单的方法来获得角色提供与Ninject工作。任何帮助AP preciated。

I can access the users through the membership provider, so the repository is being injected ok, but the roles provider seems to be different. Why does the role provider require a constructor-less parameter? Is there a simple way to get the role provider to work with Ninject. Any help appreciated.

推荐答案

由于角色提供,在这种情况下,NHibernateRoleProvider由ASP.NET框架实例的最佳解决方案是使用服务定位器模式。 Service Locator模式通常被认为是一种反模式但有时你必须要务实并接受对正在使用的框架的限制(在这种情况下,ASP.NET框架)。

Since the role provider, in this case the NHibernateRoleProvider is instantiated by the ASP.NET framework the best solution is to use the service locator pattern. The service locator pattern is normally considered to be an anti-pattern but sometimes you have to be pragmatic and accepted the limitation on the framework that is being used (in this case the ASP.NET framework).

假设你正在使用的实施<一个href=\"http://msdn.microsoft.com/en-us/library/system.web.mvc.idependencyresolver%28v=vs.98%29.aspx\">IDependencyResolver接口Ninject。下面code应该工作。

Assuming you are using an implementation of the IDependencyResolver interface for Ninject. The following code should work.

public class NHibernateMembershipProvider : MembershipProvider
{
    private IUserRepository _repo;

    public NHibernateMembershipProvider()
    {
        _repo = DependencyResolver.Current.GetService<IUserRepository>();
    }

    // ...
}

这篇关于使用Ninject与在MVC3应用自定义角色提供商的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆