2015-10-19 74 views

回答

0

使用自定义的Proxyfactory应该有所斩断。使用FluentNHibernate

var config = Fluently.Configure() 
    .ProxyFactoryFactory<MyProxyFactoryFactory>() 

实施例的配置,它使用的类

class MyProxyFactoryFactory : DefaultProxyFactoryFactory, IProxyFactoryFactory 
{ 
    IProxyFactory IProxyFactoryFactory.BuildProxyFactory() 
    { 
     return new MyProxyFactory(); 
    } 
} 

class MyProxyFactory : AbstractProxyFactory, IProxyAssemblyBuilder 
{ 
    const string PathToSave = "D:/"; 

    private readonly ProxyFactory factory; 

    public MyProxyFactory() 
    { 
     factory = new ProxyFactory(this); 
    } 

    public override INHibernateProxy GetProxy(object id, ISessionImplementor session) 
    { 
     try 
     { 
      var initializer = new DefaultLazyInitializer(EntityName, PersistentClass, id, GetIdentifierMethod, SetIdentifierMethod, ComponentIdType, session); 

      object proxyInstance = IsClassProxy 
            ? factory.CreateProxy(PersistentClass, initializer, Interfaces) 
            : factory.CreateProxy(Interfaces[0], initializer, Interfaces); 

      return (INHibernateProxy)proxyInstance; 
     } 
     catch (Exception ex) 
     { 
      throw new HibernateException("Creating a proxy instance failed", ex); 
     } 
    } 

    public override object GetFieldInterceptionProxy(object instanceToWrap) 
    { 
     var interceptor = new DefaultDynamicLazyFieldInterceptor(); 
     return factory.CreateProxy(PersistentClass, interceptor, new[] { typeof(IFieldInterceptorAccessor) }); 
    } 

    public AssemblyBuilder DefineDynamicAssembly(AppDomain appDomain, AssemblyName name) 
    { 
     return appDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave, PathToSave); 
    } 

    public ModuleBuilder DefineDynamicModule(AssemblyBuilder assemblyBuilder, string moduleName) 
    { 
     return assemblyBuilder.DefineDynamicModule(moduleName, moduleName + ".mod", true); 
    } 

    public void Save(AssemblyBuilder assemblyBuilder) 
    { 
     assemblyBuilder.Save("generatedAssembly.dll"); 
    } 
} 
+0

我得到了一个异常:“无法转换类型‘System.Reflection.Emit.InternalAssemblyBuilder’为类型“的对象System.Reflection.Emit .AssemblyBuilder' –

+0

嗯,它在我为此编写的一个快速测试程序中工作,但当我再次写入时不再工作,我将调查我什么时候有空。 – Firo