代码之家  ›  专栏  ›  技术社区  ›  Neil Hewitt

用NHibernate实现统一拦截下从代理获取真实实例

  •  4
  • Neil Hewitt  · 技术社区  · 16 年前

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

    VirtualMethodInterceptor ,因为接口拦截不适用于NHibernate。我有个门面 ISession 为存储库操作处理接口类型和实类型之间的转换。

    为了确保通过NHibernate获取的图形中的所有对象都被正确地代理为AOP,我做了一个NH IInterceptor 执行和重写 Instantiate() new() Container.Resolve() 使用注入的验证返回代理对象,并将其返回给NH进行填充。这个没问题。

    我需要知道的是:给定一个由Unity创建并启用拦截的透明代理对象,有没有办法a)获得对它代理的“真实”实例的直接引用,或者b)重写NH并告诉它在运行时动态地将代理类型的对象视为已知映射类型的对象?

    1 回复  |  直到 16 年前
        1
  •  0
  •   Backs    9 年前

    我们使用拦截进行缓存。所以在我们班上 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放入cache UpdateCallback,然后解析原始服务:

    var service = _unityContainer.Resolve(parameters.TargetType);