1

对所有可以提供帮助的人,

我是 Unity 容器的新手,我正在着手通过使用拦截来过滤包含特定接口的集合。拦截的应用对我来说是新的,即使我有使用 AutoFac 和 Castle 的经验。但是,我知道可以做到,但我很难理解为什么我的拦截器不会开火。

本质上,目标是根据登录用户的安全级别过滤对象集合。该接口已命名为ISecurable,它要求其实现者具有MinSecurityLevel属性。不幸的是,大部分代码库都不是针对接口编程的,所以这个接口是新的。由于这个事实,有几个集合将使用这个接口的实现者,即

Customer[] Customers { get; set; }
List<Order> Orders { get; set; }

Orders 和 Customers 实现ISecurable的地方。

因此,与其查找包含实现ISecurable的对象的每个集合,并根据登录用户的安全级别过滤这些集合(这将成为一个难以维护的怪物,并且让用户的登录安全级别变得令人讨厌)。我认为拦截任何包含ISecurable对象的集合都是一种简单、优雅的方式来满足这一要求,同时将该代码选项卡式放置在一个中心位置。

在这样做的过程中,我搜索了互联网上的文章和示例代码,以获得开始拦截的基线。不幸的是,没有任何事情被证明是富有成效的。

看来我和这里的海报在同一条船上:Unity Interception - Custom Interception Behavior

不幸的是,我不知道他/她如何能够连接 CallHandler 和/或 InterceptionBehavior 实现者来开始过滤他们的集合(另外,他们的代码库是针对接口编程的,即 IList,我的代码库依赖于具体类型的 Array和列表)。

这是我尝试过的代码的一些版本(没有锁定触发 Handler 或 InterceptionBehavior 类的任何属性或方法):

 container.AddNewExtension<Interception>();
 container.RegisterType<SecurityHandler>();

 container.RegisterType<IEnumerable<ISecurable>, Customer[]>(
      new Interceptor<TransparentProxyInterceptor>(),
      new InterceptionBehavior<SecurableInterceptionBehavior>());

 container.RegisterType<IEnumerable<ISecurable>, List<Order>>(
      new Interceptor<TransparentProxyInterceptor>(),
      new InterceptionBehavior<SecurableInterceptionBehavior>());

 container.Configure<Interception>)
      .AddPolicy("SecurityPolicy")
      .AddCallHandler(new SecurityHandler());

我已经尝试过使用和不使用 SecurityHandler 的代码,我得到了相同的结果 - 没有拦截触发。

感谢所有这些帮助!

以下是我迄今为止使用的参考资料:

https://msdn.microsoft.com/en-us/library/ff660851(v=pandp.20).aspx#interception_behavior_custom

PS 由于我缺乏声誉,我无法发布超过 2 个我引用的链接。对不起 :(

编辑

如果我从容器中解析类型,我可以让我的拦截器触发。

就像测试一样,这有效:

 container.RegisterType<ISecurable, Customer>(
      new Interceptor<InterfaceInterceptor>(),
      new InterceptionBehavior<SecurableInterceptionBehavior>());

 var securable = container.resolve<ISecurable>();
 securable.MinSecurityLevel = 1;
4

0 回答 0