识别NHibernate代理类

Mar*_*ell 37 .net c# nhibernate

我不是NHibernate用户; 我写了一个序列化实用程序库.用户已记录一个功能请求,我应该处理NHibernate代理类,将它们视为与实际类型相同.目前,我的代码将它们视为意外继承,并抛出异常.

代码不会提前知道NHibernate(包括没有引用,但我不是反射;-p)

是否有一种强大/可靠的方法来检测此类代理类型?显然DataContractSerializer处理这个很好,所以我希望它是非常简单的.也许是一些界面或[attribute]装饰.

此外,在反序列化期间; 目前我将创建原始类型(不是NHibernate类型).这是否适用于持久性目的?或者是否需要代理类型?如果是后者; 创建代理类型的实例需要什么?

Die*_*hon 49

您可以通过将类转换为(不出所料)来检测​​类是否是NHibernate代理INHibernateProxy.

如果您需要获取基础"真实"对象,请使用:

Session.GetSessionImplementation().PersistenceContext.Unproxy(proxiedObject)
Run Code Online (Sandbox Code Playgroud)

您不需要测试要调用的代理Unproxy; 如果它不是代理,它返回原始参数.

编辑:我现在使用不同的方法来获取底层对象,主要是为了解决延迟加载和继承:http://sessionfactory.blogspot.com/2010/08/hacking-lazy-loaded-inheritance.html

  • 这导致我朝着正确的方向前进.它不是*相当*我最终如何解决它(由于不想要依赖),但非常有帮助,谢谢. (2认同)

Vij*_*tel 16

我猜你真的不想访问实际的Nhibernate会话.此代码可能更符合您的需求:

/// <summary>
/// Returns the real type of the given proxy. If the object is not a proxy, it's normal type is returned.
/// </summary>
internal static Type GetRealType(this object proxy)
{
    if (proxy is INHibernateProxy)
    {
        var lazyInitialiser = ((INHibernateProxy)proxy).HibernateLazyInitializer;
        return lazyInitialiser.PersistentClass;
    }
    else
    {
        return proxy.GetType();
    }
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


Sam*_*ier 8

NHibernate提供了一个工具,您可以在其中提供类型(代理与否),并返回实际类型.(我正在使用NHibernate 3)

这是你如何使用它:

var realType = NHibernate.NHibernateUtil.GetClass(proxyInstance);
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助:D

  • 值得一提的是:`NHibernateProxyHelper.GetClassWithoutInitializingProxy(proxyInstance);` (2认同)