使用NHibernate在延迟加载场景中使用Castle.DynamicProxy实现IDataErrorInfo

时间:2010-12-24 08:05:11

标签: .net wpf nhibernate castle-windsor lazy-loading

我使用Castle.DynamicProxy IIterceptor实现了IDataErrorInfo接口。我还实现了一个NHibernate拦截器,它使用这个拦截器实例化我的实体。问题在于延迟加载的实体。这些是使用nhibernate配置文件中指定的代理工厂类构造的,显然不提供IDataErrorInfo实现。这个代理掩盖了我的拦截器对IDataErrorInfo的底层实现,导致验证失败。

这个问题有什么可行的解决方案?

(解决问题的一种方法是更改​​nhibernate使用的默认代理工厂。)

1 个答案:

答案 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);
      }
    }
  }