Asp.net mvc 如何在操作过滤器上使用Unity和asp.net mvc执行属性注入?
我正试图通过属性注入让依赖项注入在我的操作过滤器上工作。我不知道如何自动设置过滤器的依赖项。这是我到目前为止的代码Asp.net mvc 如何在操作过滤器上使用Unity和asp.net mvc执行属性注入?,asp.net-mvc,inversion-of-control,unity-container,Asp.net Mvc,Inversion Of Control,Unity Container,我正试图通过属性注入让依赖项注入在我的操作过滤器上工作。我不知道如何自动设置过滤器的依赖项。这是我到目前为止的代码 public class UnityActionInvoker : ControllerActionInvoker { IUnityContainer container; public UnityActionInvoker(IUnityContainer container) { this.container = container; }
public class UnityActionInvoker : ControllerActionInvoker
{
IUnityContainer container;
public UnityActionInvoker(IUnityContainer container) {
this.container = container;
}
protected override ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList<IActionFilter> filters, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters) {
foreach (var filter in filters) {
// HELP: dependency injection on all marked filter properties
}
return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
}
}
public class UnityControllerFactory : DefaultControllerFactory
{
IUnityContainer container;
public UnityControllerFactory(IUnityContainer container) {
this.container = container;
}
protected override IController GetControllerInstance(Type controllerType) {
Controller controller = null;
if (controllerType != null) {
if (!typeof(IController).IsAssignableFrom(controllerType)) {
throw new ArgumentException(string.Format("Type requested is not a controller: {0}", controllerType.Name), "controllerType");
}
controller = container.Resolve(controllerType) as Controller;
controller.ActionInvoker = new UnityActionInvoker(container);
}
return controller;
}
}
public class AccessFilterAttribute : FilterAttribute, IActionFilter
{
[Dependency]
public IUserRepository UserRepository { get; set; }
public void OnActionExecuting(ActionExecutingContext filterContext) {
throw new NotImplementedException();
}
public void OnActionExecuted(ActionExecutedContext filterContext) {
throw new NotImplementedException();
}
}
公共类UnityActionInvoker:ControllerActionInvoker
{
i单元容器;
公共UnityActionInvoker(IUnityContainer容器){
this.container=容器;
}
受保护的覆盖ActionExecuteContext InvokeActionMethodWithFilters(ControllerContext ControllerContext、IList筛选器、ActionDescriptor ActionDescriptor、IDictionary参数){
foreach(过滤器中的var过滤器){
//帮助:所有标记的筛选器属性上的依赖项注入
}
返回base.InvokeActionMethodWithFilters(controllerContext、filters、actionDescriptor、parameters);
}
}
公共类UnityController工厂:DefaultControllerFactory
{
i单元容器;
公共UnityController工厂(IUnityContainer容器){
this.container=容器;
}
受保护的覆盖IController GetControllerInstance(类型controllerType){
控制器=空;
if(controllerType!=null){
如果(!typeof(IController).IsAssignableFrom(controllerType)){
抛出新的ArgumentException(string.Format(“请求的类型不是控制器:{0}”)、controllerType.Name、“controllerType”);
}
控制器=容器。解析(controllerType)为控制器;
controller.ActionInvoker=新的UnityActionInvoker(容器);
}
返回控制器;
}
}
公共类AccessFilterAttribute:FilterAttribute,IActionFilter
{
[依赖性]
公共IUserRepository UserRepository{get;set;}
ActionExecuting(ActionExecutingContext filterContext)上的公共无效{
抛出新的NotImplementedException();
}
已执行ActionExecuted(ActionExecutedContext筛选器上下文)的公共无效{
抛出新的NotImplementedException();
}
}
答案是:
public class UnityActionInvoker : ControllerActionInvoker
{
IUnityContainer container;
public UnityActionInvoker(IUnityContainer container) {
this.container = container;
}
protected override ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList<IActionFilter> filters, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters) {
foreach (var filter in filters) {
container.BuildUp(filter.GetType(), filter);
}
return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
}
}
公共类UnityActionInvoker:ControllerActionInvoker
{
i单元容器;
公共UnityActionInvoker(IUnityContainer容器){
this.container=容器;
}
受保护的覆盖ActionExecuteContext InvokeActionMethodWithFilters(ControllerContext ControllerContext、IList筛选器、ActionDescriptor ActionDescriptor、IDictionary参数){
foreach(过滤器中的var过滤器){
container.building(filter.GetType(),filter);
}
返回base.InvokeActionMethodWithFilters(controllerContext、filters、actionDescriptor、parameters);
}
}
很好的解决方案。但我认为更好的方法是在ControllerActionInvoker.GetFilters
方法中注入过滤器。不,即使是我以前的解决方案也不是最好的。最好的方法是删除FilterProviders.providers
中的原始提供程序,然后在构建筛选器的位置添加自己的UnityFilterProviders
。