使用Unity 2和MVC 3将类注入Authentication属性

我读了很多文章,指出如何做到这一点,即:

堆栈溢出解决方案

Brad Wilsons出色的教程

这些看起来效果很好,但是当我遵循这里的一些指导原则时

保护ASP.NET MVC 3应用程序

我好像来了一个收割机。 对我来说,问题是当我将AuthorizationAttribute添加为GlobalFilter而不仅仅是装饰控制器/动作时。 虽然依赖解析器似乎被调用并设置我公开的[Dependancy]属性,当它实际到达我覆盖AuthorizeAttribute的OnAuthorization()方法的代码部分时,我的public [Dependency]属性为null。

当我从全局filter中删除它并装饰一个控制器时,它似乎工作。

如果需要更多信息,我可以发布代码。

编辑:为了进一步扩展这里我的一些代码:

的global.asax.cs

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { // If I have this here the my [Dependency] attribute does not keep it's value // If I remove it and decorate the controller the [Dependency] attribute keeps it value filters.Add(new BasicAuthenticationAttribute()); filters.Add(new HandleErrorAttribute()); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); // injection of services and data contexts var container = new UnityContainer(); // injections for services RegisterUnityServices(container); // Filter provides to allow injection into attribute filters RegisterUnityFilters(container); } private void RegisterUnityServices(UnityContainer container) { container.RegisterType(); container.RegisterType(); container.RegisterType(); // add more services here ... DependencyResolver.SetResolver(new Models.UnityDependencyResolver(container)); } private void RegisterUnityFilters(UnityContainer container) { var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); FilterProviders.Providers.Remove(oldProvider); var provider = new UnityFilterAttributeFilterProvider(container); FilterProviders.Providers.Add(provider); } 

我的Unity课程取自brad wilsons的例子:

  public class UnityDependencyResolver : IDependencyResolver { readonly IUnityContainer _container; public UnityDependencyResolver(IUnityContainer container) { this._container = container; } public object GetService(Type serviceType) { try { return _container.Resolve(serviceType); } catch { return null; } } public IEnumerable GetServices(Type serviceType) { try { return _container.ResolveAll(serviceType); } catch { return new List(); } } } 

  public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider { private IUnityContainer _container; public UnityFilterAttributeFilterProvider(IUnityContainer container) { _container = container; } public override IEnumerable GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var filters = base.GetFilters(controllerContext, actionDescriptor); foreach (var filter in filters) { _container.BuildUp(filter.Instance); } return filters; } protected override IEnumerable GetControllerAttributes( ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var attributes = base.GetControllerAttributes(controllerContext, actionDescriptor); foreach (var attribute in attributes) { _container.BuildUp(attribute.GetType(), attribute); } return attributes; } protected override IEnumerable GetActionAttributes( ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var attributes = base.GetActionAttributes(controllerContext, actionDescriptor); foreach (var attribute in attributes) { _container.BuildUp(attribute.GetType(), attribute); } return attributes; } } 

和My BasicAuthenticationAttribute的基础,我有[Dependency]属性正在设置但不触发OnAuthorization方法时的值。

  public class BasicAuthenticationAttribute : AuthorizeAttribute { [Dependency] public IAuthenticationService Authentication { get; set; } private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus) { validationStatus = OnCacheAuthorization(new HttpContextWrapper(context)); } public override void OnAuthorization(AuthorizationContext filterContext) { // code here that uses the Authentication attribute but it's null } 

你有没有解决这个问题? 我认为你需要在属性类中调用DependencyResolver …不确定[Dependency]属性是否在这里工作…所以在OnAuthorization方法中调用IAuthenticationService authentication = DependencyResolver.Current.GetService();