我已经使用 Castle.DynamicProxy IIterceptor 实现了 IDataErrorInfo 接口。我还实现了一个 NHibernate 拦截器,它使用该拦截器实例化我的实体。问题在于延迟加载的实体。这些是使用 nhibernate 配置文件中指定的代理工厂类构造的,它显然不提供 IDataErrorInfo 实现。该代理通过我的拦截器掩盖了 IDataErrorInfo 的底层实现,这导致验证失败。
这个问题有哪些可能的解决方案?
(解决该问题的一种方法是更改 nhibernate 使用的默认代理工厂。)
一种解决方案是覆盖默认的 Castle 代理工厂并使用 IDataErrorInfo 扩展接口数组。 LazyInitializer 实际上并没有实现这个接口,它只是将调用转发到我们自己的代理实现。这DataBindingProxyFactory
然后必须注册为 NHibernate 代理工厂。
public class DataBindingProxyFactory : ProxyFactory, IProxyFactoryFactory
{
public IProxyValidator ProxyValidator { get { return new DynProxyTypeValidator(); } }
public IProxyFactory BuildProxyFactory()
{
return new DataBindingProxyFactory();
}
public bool IsInstrumented(Type entityClass)
{
return true;
}
public override INHibernateProxy GetProxy(object id, ISessionImplementor session)
{
try
{
var initializer = new LazyInitializer(EntityName, PersistentClass, id, GetIdentifierMethod,
SetIdentifierMethod, ComponentIdType, session);
var interfaces =
new List<Type>(Interfaces){
typeof (INotifyPropertyChanged),
typeof (IDataErrorInfo)
}.ToArray();
var generatedProxy = IsClassProxy
? DefaultProxyGenerator.CreateClassProxy(PersistentClass, interfaces, initializer)
: DefaultProxyGenerator.CreateInterfaceProxyWithoutTarget(Interfaces[0], interfaces,
initializer);
initializer._constructed = true;
return (INHibernateProxy) generatedProxy;
}
catch (Exception e)
{
log.Error("Creating a proxy instance failed", e);
throw new HibernateException("Creating a proxy instance failed", e);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)