首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionFilterAttribute中的属性注入

ActionFilterAttribute中的属性注入
EN

Stack Overflow用户
提问于 2016-03-22 14:24:01
回答 1查看 436关注 0票数 0

我想要在ActionFilterAttribute内部通过Ninject实现DI。我已经找到了本手册 (实际上我今天已经读过几十个了),但是它是为团结而写的。我在尼尼姆上实现它的尝试是这样的:

代码语言:javascript
复制
public class MyFilter : ActionFilterAttribute
{
    [Inject]
    public IDepend Depend { get; set; }
    // another code
}

绑定:

代码语言:javascript
复制
public class NinjectResolver : IDependencyResolver
{
    // another code
    private IKernel AddRequestBindings(IKernel kernel)
    {
        // another code
        kernel.Bind<IDepend>().To<Depend>();
        return kernel;
    }
}

自定义FilterProvider:

代码语言:javascript
复制
public class WebApiNinjectActionFilterProvider : ActionDescriptorFilterProvider, IFilterProvider
{
    private readonly IKernel _kernel;
    private readonly IEnumerable<IFilterProvider> _filterProviders;

    public WebApiNinjectActionFilterProvider(IKernel kernel, IEnumerable<IFilterProvider> filterProviders)
    {
        _kernel = kernel;
        _filterProviders = filterProviders;
    }

    public new IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        var filters = _filterProviders.SelectMany(fp => fp.GetFilters(configuration, actionDescriptor)).ToList();
        foreach (var filter in filters)
        {
            // GET ActivationException HERE!!!!!
            _kernel.Inject(filter.Instance);
        }
        return filters;
    }

    public static void RegisterFilterProviders(IKernel ninjectKernel)
    {
        var providers = GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();
        GlobalConfiguration.Configuration.Services.Add(typeof(IFilterProvider),
                                                       new WebApiNinjectActionFilterProvider(ninjectKernel, providers));
        var defaultprovider = providers.First(i => i is ActionDescriptorFilterProvider);
        GlobalConfiguration.Configuration.Services.Remove(typeof(IFilterProvider), defaultprovider);
    }
}

从WebApiConfig调用:

代码语言:javascript
复制
    public static void Register(HttpConfiguration config)
    {
        var ninjectKernel = new StandardKernel();
        config.DependencyResolver = new NinjectResolver(ninjectKernel);

        WebApiNinjectActionFilterProvider.RegisterFilterProviders(ninjectKernel);
    }

最后行动:

代码语言:javascript
复制
    [MyFilter]
    public async Task<string> Test()
    {
        return "Hello world";
    }

问题是,我在这一行中得到了一个ActivationException:

代码语言:javascript
复制
_kernel.Inject(filter.Instance);

ActivationException的激活路径

2)将依赖IDepend注入属性依赖于MyFilter类型

1) MyFilter请求

如果要向控制器注入相同的属性,那么就可以很好地注入。有什么办法改进我的代码吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-23 13:15:16

我用错误的方式做IActionFilter DI。我在马克·塞曼的博客找到了正确的方法。

迪瓦内·尼尼特是以这种方式实施的:

代码语言:javascript
复制
var myFilter = new MyFilter(ninjectKernel.Get<IDepend>());
config.Filters.Add(myFilter);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36157039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档