对所有可以提供帮助的人,
我是 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;