问题标签 [unity-interception]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1470 浏览

nhibernate - 使用 NHibernate 在 Unity 拦截下从代理获取真实实例

我正在使用 Unity 为可插拔架构动态解析类型。我还使用拦截通过 AOP 应用业务规则验证(使用ValidationAspects)。最后,我使用 NHibernate 作为 ORM 来持久化域对象。

为了让 AOP 工作,我们使用VirtualMethodInterceptor, 因为接口拦截不适用于 NHibernate。我有一个外观ISession来处理存储库操作的接口和真实类型之间的转换。

为了确保通过 NHibernate 获取的图中的所有对象都为 AOP 正确代理,我做了一个 NHIInterceptor实现并覆盖了该Instantiate()方法,因此我可以为 NH 提供创建的对象而不是让它调用new(). 然后,我使用Container.Resolve()注入验证来取回代理对象,并将其返回给 NH 以填充。这工作正常。

当会话刷新发生时,问题就出现了。NHibernate 感到不安,因为它在图中看到的对象是代理类型而不是真实类型。如果我可以覆盖类型检查,我们映射的方式(所有通过属性,所有虚拟)NH 应该能够通过代理获取它需要的所有值。

我需要知道的是:给定由 Unity 创建并启用拦截的透明代理对象,是否有任何方法可以直接引用它正在代理的“真实”实例,或者 b) 覆盖 NH 并告诉它处理代理类型的对象,就好像它是已知的映射类型一样,在运行时动态?

0 投票
2 回答
2921 浏览

c# - AOP 拦截属性

所以,我有这个问题,似乎没有人能够提供帮助。因此,与其继续抨击,我将把它扔出去,寻找其他方法来剥皮这只特殊的猫。

我目前有以下内容:

...并且使用 Unity,我有 IOC 设置,同时配置拦截,如:

我想要实现的是能够像这样在界面中放置属性:

...定义为:

...然后在 LogHandler 类中执行我想要的所有日志记录:

我想要实现的是一个跟踪/记录系统,其中处理程序记录正在调用的 namespace.class.methodname,以及调用它的父 namespace.class.methodname。我尝试使用“输入”IMethodInvocation 参数来获取我想要的信息但没有成功,问题是,输入返回“ICustomerService”接口,同时检查父级的堆栈帧返回父级的实现类(例如.CustomerService)意味着当我尝试使用 namespace.class.methodname 作为实体 ID 创建树结构时,ID 和 parentID 不匹配。

将参数放入 [Log] 属性也不会真正起作用,因为我可以在那里放什么?如果我输入接口名称,我仍然有与上面相同的问题,其中一个的 ID 是一个接口,而父级是实现类。而且,我不能将实现类名放在接口的属性中,因为这首先违背了拥有接口的目的!

所以,这就是两难境地。有人有新的想法吗?

0 投票
1 回答
593 浏览

.net - 在 WPF 的 Prism v2 中使用 Unity 进行拦截(不适用于我)

我无法使用 Prism v2(2009 年 10 月)进行拦截。我试图拦截任何公共属性的 Setter,然后在属性发生更改时触发 PropertyChanged 事件。我可以看到代码被执行(通过调试器单步执行或添加调试点)。但是,绑定到这些属性的 WPF 窗口控件不会得到更新。如果我订阅这些事件并打印到控制台,我可以打印出属性更改通知。

因此,如果 View 有一个文本框,它会更新 ViewModel 上的属性,那么 ViewModel 中的属性就会更新。但是,如果视图上的按钮(作为 DelegateCommand 实现)导致属性更新,则绑定到该属性的文本框(双向绑定模式)不会更新,即使触发了事件并且控制台已打印出有关更新了哪个属性的信息。有没有人遇到过这个问题?

这是我编写的示例 WPF 应用程序。Wordpress 不允许上传 zip 文件,因此我将其重命名为 pdf 扩展名(将文件重命名为 zip 扩展名)。请让我知道我做错了什么。提前致谢。

0 投票
1 回答
411 浏览

unity-container - 使用 Unity 拦截子方法调用

使用 PIAB / Unity,是否可以拦截“子”方法调用?

例如,该类具有三个方法...

DoSomething() 方法调用 DoFirst() 进而调用 DoSecond()

我可以拦截 DoSomething,但我无法为 DoFirst 和 DoSecond 获取任何信息。我尝试了各种策略注入规则……类型匹配、标记属性、方法签名……但没有任何效果。但是如果我直接调用它们,我可以拦截每个方法

这么基本的问题……你能做到吗?

如果是这样,如何!

0 投票
2 回答
1162 浏览

c# - Microsoft Unity:使用 BuildUp 而不是 Resolve 时拦截不起作用

我正在使用 Microsoft Unity 2.0,并且拦截扩展没有按预期工作。

考虑这两行代码:

这两行没有得到你期望的 someObject 的动态代理!在这种情况下如何进行拦截?

0 投票
2 回答
3351 浏览

c# - Unity:将两个接口注册为一个单例并进行拦截

我有一个实现两个接口的类,我想对类的方法应用拦截。

我遵循Unity Register two interfaces as one singleton中的建议,但我对结果感到惊讶。简而言之,似乎我的 CallHandler 被调用了两次。我有的最短的例子是这样的:

这给出了这个输出:

删除“container.RegisterType I2, C”行会使日志只出现一次。添加第三个接口 I3,与 I2 类似,会导致日志出现 3 次。

我本来希望日志只被调用一次。我可以通过让 LogCallHandler 检测它是否从另一个 LogCallHandler 调用来实现这一点,但这似乎不优雅。

最初我想将拦截行为应用于 C 而不是分别应用于 I1 和 I2,但这需要 C 从 MarshalByRefObject 继承,这是我还不愿意强加的约束。

有替代方法吗?

0 投票
1 回答
561 浏览

unity-container - 拦截是否值得它产生的开销?

我正在努力将 NHibernate 引入我们的代码库。我想我必须使用某种 DI 容器,这样我就可以将依赖项注入从数据库加载的实体中。我选择 Unity 作为容器。

我正在考虑使用 Unity 的拦截机制向我的代码添加事务方面,因此我可以执行以下操作:

处理[Transaction]程序将负责创建会话和事务,提交事务(或回滚异常)等。

我担心使用这种拦截方式会束缚我在代码中几乎所有地方都使用 Unity。如果我以这种方式引入方面,那么我绝不能调用new SomeService(),否则我将获得没有事务的服务。虽然这在生产代码中是可以接受的,但在测试中似乎开销太大。例如,我必须将其转换为:

进入这个:

这为我正在使用的每个模拟对象添加了 2 行代码,这导致了相当多的代码(我们的测试使用了很多有状态的模拟,因此测试类拥有 5-8 个模拟对象并不少见,并且有时更多。)

我不认为独立注入在这里会有所帮助:我必须为我在测试中使用的每个类设置注入,因为可以在编写测试后将方面添加到类中。

现在,如果我放弃使用拦截,我最终会得到:

诚然,这不是那么好,但似乎也没有那么糟糕。

我什至可以设置我自己的穷人的拦截:

然后我的拦截器可以处理类的属性,但我仍然可以使用实例化类new而不必担心失去功能。

有没有更好的使用 Unity 拦截的方法,它不会强迫我总是使用它来实例化我的对象?

0 投票
2 回答
2415 浏览

.net - Unity 基于代码的拦截/日志配置

我使用 Unity 作为 IoC 容器,到目前为止效果很好。现在我想使用带有 TypeMatchingRule 和 LogCallHandler 的拦截来记录对接口 IMyInterface 的所有调用。我正在通过代码配置统一,但无法让日志记录工作。有人可以指点我一个简单的例子吗?我在文档中发现了相当多的小片段,但我无法为我的用例构建工作配置。好像我错过了大局!?

0 投票
2 回答
2228 浏览

c# - Unity拦截:如何将参数传递给ICallHandler实现?

我可以像这样将消息参数传递给 ICallHandler 实现吗:

并像这样使用它:

?

0 投票
0 回答
658 浏览

unity-container - 为可拦截类型指定策略

假设我有以下代码:

现在的配置方式,每次我解析一个 Interceptable 实例并在其上调用公共虚拟方法时,都会尝试 4 个匹配规则(来自两个策略)。

这可能会在实际应用中产生开销。我想做的是指定我只希望(例如)“PolicyName”策略应用于 Interceptable 类的实例。有没有办法做到这一点?

谢谢