Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在操作过滤器上使用Unity和asp.net mvc执行属性注入?_Asp.net Mvc_Inversion Of Control_Unity Container - Fatal编程技术网

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