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
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)
希望有所帮助.
NHibernate提供了一个工具,您可以在其中提供类型(代理与否),并返回实际类型.(我正在使用NHibernate 3)
这是你如何使用它:
var realType = NHibernate.NHibernateUtil.GetClass(proxyInstance);
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助:D
| 归档时间: |
|
| 查看次数: |
22730 次 |
| 最近记录: |