gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:28:12 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com