如何在动作过滤器上使用Unity和asp.net mvc执行属性注入?

use*_*334 4 asp.net-mvc inversion-of-control unity-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();
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*334 5

答案是:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)