我有一个自定义的会员/角色提供程序,我在我的MVC控制器中使用它,我也希望ASP.NET MVC可以访问它,这样我就可以使用AuthorizationFilters等功能。由于很多人都实现了自定义提供程序,我想很多人都已经做到了这一点,但我还没有找到解决这个问题的帖子或文章。这篇文章是我问题的反面。在我的情况下,我的自定义提供程序在我的控制器中正常工作,我希望MVC也能使用它。
我的提供程序采用IoC/依赖注入设计实现。该提供程序除了基线会员/角色API外,还公开了其他功能。在我的控制器中,我使用Castle Windsor创建实例。代码看起来类似于:
我知道告诉ASP.NET自定义成员资格或角色提供程序的通常方式是在web.config文件中如下所示,但如果我这样做,ASP.NET将尝试调用默认构造函数,这是行不通的。希望能得到任何帮助。
我的提供程序采用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);
}
这在我的C#代码中都很好运行,但我想将我的提供程序连接到MVC中,以使用[Authorize]筛选器:
[Authorize (Users="user1, user2", Roles="role8")]
public ViewResult MyResult(int x) {
// implement
}
我知道告诉ASP.NET自定义成员资格或角色提供程序的通常方式是在web.config文件中如下所示,但如果我这样做,ASP.NET将尝试调用默认构造函数,这是行不通的。希望能得到任何帮助。
<membership>
<providers>
<clear/>
<add name="MyMembershipProvider" type="MyMembershipProvider">
</providers>
</membership>