【发布时间】:2015-08-13 22:32:33
【问题描述】:
我正在使用 Unity 为可插拔架构动态解析类型。我还使用拦截通过 AOP 应用业务规则验证(使用 ValidationAspects)。最后,我使用 NHibernate 作为 ORM 来持久化域对象。
为了让 AOP 工作,我们使用VirtualMethodInterceptor,因为接口拦截不适用于 NHibernate。我在ISession 上有一个外观,它处理接口和真实类型之间的转换以进行存储库操作。
为了确保通过 NHibernate 获取的图形中的所有对象都为 AOP 正确代理,我创建了一个 NH IInterceptor 实现并覆盖了 Instantiate() 方法,因此我可以为 NH 提供创建的对象而不是让它调用new()。然后,我使用Container.Resolve() 来取回注入了验证的代理对象,并将其返回给 NH 以填充。这工作正常。
问题出现在会话刷新发生时。 NHibernate 感到不安,因为它在图中看到的对象是代理类型而不是真实类型。如果我可以覆盖类型检查,我们映射的方式(所有通过属性,所有虚拟)NH 应该能够通过代理获取它需要的所有值。
我需要知道的是:给定由 Unity 创建并启用拦截的透明代理对象,是否有任何方法可以直接引用它正在代理的“真实”实例,或者 b) 覆盖 NH 并告诉是否将代理类型的对象视为已知映射类型,在运行时动态处理?
【问题讨论】:
-
你能建立一个基本的测试用例吗?您是否考虑过使用 NHibernate.Validator 代替这个? (nhforge.org/wikis/validator10/…)
-
我没有,不过既然你提到了,我可能会多看一点。我们特别喜欢 ValidationAspects,因为它具有 AOP 功能——您可以进行方法或参数级别的验证,而根本不需要调用任何辅助方法。
-
即使是一个简单的测试用例也可能会运行到很多 LOC。我知道“问题”是什么——这是 NH 世界观和 Unity Interceptor 观点之间的冲突。理论上 Castle Windsor + PostSharp 会起作用,但我喜欢 Unity 并且想尝试一下。可能不得不破解源代码:-(
-
nhibernate.validator 通过事件监听器注册,所以你不需要调用任何辅助方法
-
谢谢,我再仔细看看。
标签: nhibernate unity-container aop unity-interception