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

标签 nhibernate unity-container aop unity-interception

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

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

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

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

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

最佳答案

我们使用拦截进行缓存。所以在我们的类中,实现了ICallHandler我们有这样的代码:

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        //...
        var nextHandler = getNext();

        var realReturn = nextHandler(input, getNext);

        var cacheRefreshingItemParameters = new CacheRefreshingItemParameters
        {
            InterfaceMethod = input.MethodBase,
            InterfaceType = input.MethodBase.DeclaringType,
            TargetType = input.Target.GetType() //remember original type
        };
        _cacheProvider.Add(cacheKey, realReturn.ReturnValue, cacheRefreshingItemParameters);

        //...
        return (cachedReturn);
    }

我们将 cacheRefreshingItemParameters 放入缓存 UpdateCallback 中,然后解析原始服务:
var service = _unityContainer.Resolve(parameters.TargetType);

关于nhibernate - 使用 NHibernate 在 Unity 拦截下从代理获取真实实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/583011/

相关文章:

java - 从aspectJ中带注释的方法获取局部变量值

nhibernate - Fluent NHibernate (1.2.0.712) 导出到 HBM 的映射不起作用/不遵守约定

c# - 流利的 : Table name different from entity name

wcf - 在 Azure Webrole OnStart 中保存时,HttpRuntime.Cache 对象为 null

nunit - Unity Nunit 和 Rhino 模拟

java - 如何使不正确的切入点表达式抛出异常?

java - 识别方法的不同执行(执行对象)?

c# - session 关闭后无法访问引用的对象

c# - 在 NHibernate 中为子查询使用接口(interface)

c# - Unity 和 WCF 库 : Where to load unity in a wcf library?