ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 基于Ninject约定的绑定装饰器

2019-06-29 14:54:00  阅读:140  来源: 互联网

标签:c net ninject


我们使用基于Ninjects约定的绑定来自动将一组命令和查询绑定到它们的处理程序.到目前为止,我们有一个装饰器使用以下工作.

绑定所有没有属性:

    Kernel.Bind(x =>
      x.FromThisAssembly()
       .SelectAllClasses()
       .InheritedFrom(typeof(ICommandHandler<>))
       .WithoutAttribute<DoCheckAttribute>()
       .BindAllInterfaces());

使用属性绑定所有:

    Kernel.Bind(x =>
      x.FromThisAssembly()
       .SelectAllClasses()
       .InheritedFrom(typeof(ICommandHandler<>))
       .WithAttribute<DoCheckAttribute>()
       .BindAllInterfaces()
       .Configure(c => c.WhenInjectedInto(typeof(DoCheckDecorator<>))));

我们尝试了以下添加另一个装饰器,但是这失败了.

绑定所有没有属性:

    Kernel.Bind(x =>
      x.FromThisAssembly()
       .SelectAllClasses()
       .InheritedFrom(typeof(ICommandHandler<>))
       .WithoutAttribute<DoCheckAttribute>()
       .WithoutAttribute<DoOtherCheckAttribute>()
       .BindAllInterfaces());

使用属性绑定所有:

    Kernel.Bind(x =>
      x.FromThisAssembly()
       .SelectAllClasses()
       .InheritedFrom(typeof(ICommandHandler<>))
       .WithAttribute<DoCheckAttribute>()
       .WithoutAttribute<DoOtherCheckAttribute>()
       .BindAllInterfaces()
       .Configure(c => c.WhenInjectedInto(typeof(DoCheckDecorator<>))));

    Kernel.Bind(x =>
      x.FromThisAssembly()
       .SelectAllClasses()
       .InheritedFrom(typeof(ICommandHandler<>))
       .WithoutAttribute<DoCheckAttribute>()
       .WithAttribute<DoOtherCheckAttribute>()
       .BindAllInterfaces()
       .Configure(c => c.WhenInjectedInto(typeof(DoOtherCheckDecorator<>))));

是否有可能使用Ninject以这种方式实现这一目标?我们是否必须回滚以手动定义每个绑定,即?

    Bind<X>.To<Y>.WhenInjectedInto(?)

理想情况下,我们会使用如下语法:

    Bind<X>.To<Y>.WithDecorator<Z>.When(a => a.HasAttribute<DoCheckAttribute>)

解决方法:

所以似乎Ninject已经有了一个可以解决这个问题的扩展.使用拦截器扩展可以将属性写为:

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public sealed class DoCheckAttribute : InterceptAttribute
    {
        public override IInterceptor CreateInterceptor(IProxyRequest request)
        {
            return request.Context.Kernel.Get<DoCheckInterceptor>();
        }
    }

然后将实际拦截写为:

    public class DoCheckInterceptor : IInterceptor
    {
         public void Intercept(IInvocation invocation)
         {
            //Do Work
            invocation.Proceed();
         }
    }

这意味着绑定变得如此简单:

    Kernel.Bind(x =>
       x.FromThisAssembly()
        .SelectAllClasses()
        .InheritedFrom(typeof(ICommandHandler<>))
        .BindAllInterfaces());

现在可以轻松添加新属性,而无需对绑定进行任何更改.多个属性也可以具有定义的运行顺序,例如:

     [DoCheck(Order = 0), DoOtherCheck(Order = 1)]
     public class TestClass
     {
     }

标签:c,net,ninject
来源: https://codeday.me/bug/20190629/1327046.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有