我使用Castle.DynamicProxy IIterceptor实现了IDataErrorInfo接口。我还实现了一个NHibernate拦截器,它使用这个拦截器实例化我的实体。问题在于延迟加载的实体。这些是使用nhibernate配置文件中指定的代理工厂类构造的,显然不提供IDataErrorInfo实现。这个代理掩盖了我的拦截器对IDataErrorInfo的底层实现,导致验证失败。
这个问题有什么可行的解决方案?
(解决问题的一种方法是更改nhibernate使用的默认代理工厂。)
答案 0 :(得分:0)
一种解决方案是覆盖默认的Castle代理工厂,并使用IDataErrorInfo扩展interfaces数组。 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);
}
}
}