Asp.net-Mvc-3

Mvc 3/Unity 2 將依賴項注入過濾器?

  • July 8, 2013

我如何注入以下依賴項?

public class Authenticate : AuthorizeAttribute
{
       [Dependency]
       public IAuthenticate AuthenticateLibrary { get; set; }

       [Dependency]
       public ILibrary BaseLibrary { get; set; }

       protected override bool AuthorizeCore(HttpContextBase httpContext)
       {
       }
}

我正在使用 Unity 2 注入所有控制器。是否有 Unity 2 的教程並將依賴項注入過濾器?

Brad Wilson 有一個很好的關於服務位置的系列,其中包括如何創建自己的支持依賴注入的過濾器提供程序:http: //bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html (向下滾動到“向過濾器添加依賴注入”部分)。

  • 複製他為 UnityFilterAttributeFilterProvider.cs 提供的程式碼。

UnitFilterAttributeFilterProvider.cs

using System.Collections.Generic;
using System.Web.Mvc;
using Microsoft.Practices.Unity;

public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider {
   private IUnityContainer _container;

   public UnityFilterAttributeFilterProvider(IUnityContainer container) {
       _container = container;
   }

   protected override IEnumerable<FilterAttribute> 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<FilterAttribute> GetActionAttributes(
               ControllerContext controllerContext,
               ActionDescriptor actionDescriptor) {

       var attributes = base.GetActionAttributes(controllerContext,
                                                 actionDescriptor);
       foreach (var attribute in attributes) {
           _container.BuildUp(attribute.GetType(), attribute);
       }

       return attributes;
   }
}
  • 修改 global.asax.cs 的 Application_Start 以使 UnityFilterAttributeFilterProvider 成為 MVC 應用程序的過濾器提供程序。

.

protected void Application_Start() {
   // ...

   var oldProvider = FilterProviders.Providers.Single(
       f => f is FilterAttributeFilterProvider
   );
   FilterProviders.Providers.Remove(oldProvider);

   var container = new UnityContainer();
   var provider = new UnityFilterAttributeFilterProvider(container);
   FilterProviders.Providers.Add(provider);

   // ...
}
  • 裝飾您希望 Unity 為其註入值的屬性$$ Dependency $$屬性。然後你應該很高興。

引用自:https://stackoverflow.com/questions/6121050