如何将IoC Membership provider与ASP.NET MVC集成

kei*_*thm 18 asp.net-mvc dependency-injection castle-windsor asp.net-membership

我有一个自定义成员资格/角色提供程序,我在我的MVC控制器中使用,我也希望ASP.NET MVC可以访问,所以我可以使用AuthorizationFilters等.由于很多人已经实现了自定义提供程序,我想很多人都做过这个,但我没有想出来或发现专门解决这个问题的帖子.这篇文章有点像我的问题的另一面.在我的情况下,我的自定义提供程序与我的控制器配合良好,我也希望MVC也能使用它.

我的提供程序使用IoC /依赖注入设计实现.提供程序公开了基线成员资格/角色API之外的其他功能.在我的控制器中,我使用Castle Windsor创建实例.代码看起来类似于:

public class HomeController : Controller {
    IMembershipService _membershipService;
    public HomeController(IMembershipService membershipService) {
        _membershipService= membershipService;
    }
}

<castle>
 <components>
  <component id="MembershipService" 
             service="IMembershipService, MyApp" 
             type="MembershipService, MyApp" lifestyle="PerWebRequest">
    <parameters>
      <connectionString>#{defaultConnectionString}</connectionString>
    </parameters>
  </component>
 </components>
</castle>

public class WindsorControllerFactory : DefaultControllerFactory {
    private WindsorContainer _container;
    public WindsorControllerFactory() {
        _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

        List<Type> controllerTypes = new List<Type>();
        foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) {
            if (typeof(IController).IsAssignableFrom(t))
                controllerTypes.Add(t);
        }

        foreach (Type t in controllerTypes) {
            // LifestyleType.Transient = new controller instance for each request
            _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
        }
    }

    protected override IController GetControllerInstance(Type controllerType) {
        return (IController)_container.Resolve(controllerType);
    }
Run Code Online (Sandbox Code Playgroud)

这一切都适用于我的C#代码,但我想将我的提供程序连接到MVC以使用它的[Authorize]过滤器:

[Authorize (Users="user1, user2", Roles="role8")]
public ViewResult MyResult(int x) {
    // implement
}
Run Code Online (Sandbox Code Playgroud)

我知道告诉ASP.NET有关自定义成员资格或角色提供程序的常用方法是在web.config文件中,如下所示,但如果我这样做,ASP.NET将只尝试调用默认构造函数,这将无效.任何帮助赞赏.

<membership>
 <providers>
  <clear/>
  <add name="MyMembershipProvider" type="MyMembershipProvider">
 </providers>
</membership>
Run Code Online (Sandbox Code Playgroud)

Mau*_*fer 24

让它工作的最简单方法是<membership>在web.config中使用ASP.NET的标准机制.您只需让它使用默认构造函数,您重写Initialize()并在那里取依赖项.使用作为参考.

就个人而言,由于这样的事情,我更愿意完全避免使用提供者模型,所以我使用的方法类似于MonoRail文档中描述的方法.恕我直言,它不那么臃肿,更灵活.最后,它只是设置HttpContext.User与适当的IPrincipal实现,这是AuthorizeAttribute使用的.

我最近写了一篇关于使用MembershipProviders做适当的IoC的解决方案.

  • 看起来webdotnet项目目前正在将其存储库移动到mercurial,链接被破坏:-( (2认同)