Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何将IoC成员资格提供商与ASP.NET MVC集成_Asp.net Mvc_Dependency Injection_Asp.net Membership_Castle Windsor - Fatal编程技术网

Asp.net mvc 如何将IoC成员资格提供商与ASP.NET MVC集成

Asp.net mvc 如何将IoC成员资格提供商与ASP.NET MVC集成,asp.net-mvc,dependency-injection,asp.net-membership,castle-windsor,Asp.net Mvc,Dependency Injection,Asp.net Membership,Castle Windsor,我有一个自定义的成员资格/角色提供程序,我在我的MVC控制器中使用它,我也希望ASP.NET MVC能够访问它,因此我可以使用AuthorizationFilters,等等,因为有这么多人已经实现了自定义提供者,我想很多人已经实现了,但我还没有弄明白,也没有找到专门解决这个问题的帖子。这是我问题的另一面。在我的例子中,我的自定义提供程序与我的控制器配合得很好,我希望MVC也能使用它 我的提供者是通过IoC/依赖注入设计实现的。提供程序公开了基线成员资格/角色API之外的其他功能。在我的控制器中,

我有一个自定义的成员资格/角色提供程序,我在我的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);
    }
我知道告诉ASP.NET有关自定义成员资格或角色提供程序的常用方法是在web.config文件中,如下所示,但如果我这样做,ASP.NET将尝试调用默认构造函数,这将不起作用。谢谢你的帮助

<membership>
 <providers>
  <clear/>
  <add name="MyMembershipProvider" type="MyMembershipProvider">
 </providers>
</membership>


最简单的方法是在web.config中使用ASP.NET的标准机制
。您只允许它使用默认构造函数,但是覆盖Initialize()并将依赖项拉到那里。用作参考

就我个人而言,由于这样的原因,我更愿意完全避免使用提供者模型,因此我使用了一种类似的方法。我觉得它不那么臃肿,更灵活。最后,这只是设置一个合适的实现,这就是AuthorizeAttribute所使用的


我最近很忙。

谢谢你。虽然您的第一个方法工作得很好,但正如您所说的,创建自定义IPrincipal/IIdentity类提供了更大的灵活性。例如,这是一条短路径,用于创建与表单身份验证提供的不同类型的用户/角色授权。看起来webdotnet项目当前正在将其存储库移动到mercurial,链接已断开:-(
<membership>
 <providers>
  <clear/>
  <add name="MyMembershipProvider" type="MyMembershipProvider">
 </providers>
</membership>