2011-08-22 50 views
2

我的代理生成器无法为内部映射的Nhibernate类生成代理。我试图使用InternalsVisibleTo在assemblyinfo.cs中将它们添加为可见,但它似乎不起作用。更糟糕的是,我不知道如何判断我是否已经成功地管理好了我想要的代理程序集,因为如果我在assemblyinfo.cs中的代理程序集公钥中更改了一些数字,则不会引发任何错误。Nhibernate映射的内部类和InternalsVisibleTo

错误:

试验方法TestProject1.UnitTest1.TestMethod1抛出异常: NHibernate.HibernateException:创建失败---> Castle.DynamicProxy.Generators.GeneratorException代理实例:类型是不公开的,所以代理无法生成。类型:BaseSystemCore.Domain.Lot

堆栈跟踪:

Castle.DynamicProxy.DefaultProxyBuilder.AssertValidType(类型目标) Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy(类型classToProxy,类型[] additionalInterfacesToProxy,ProxyGenerationOptions选项) 城堡.DynamicProxy.ProxyGenerator.CreateClassProxy(类型classToProxy,类型[] additionalInterfacesToProxy,ProxyGenerationOptions选项,对象[],构造函数,IInterceptor []拦截器) NHibernate.ByteCode.Castle.ProxyFactory.GetProxy(对象ID,ISessionImplementor会话) NHibernateUtilities.BaseUnitOfWork。 C:\ Users \ Isaac.G中的handleException(异常e) \ Desktop \ svn.bolinger.ca \ Library Projects \ NHibernateUtilities \ NHibernateUtilities \ BaseUnitOfWork.cs:line 871 NHibernateUtilities.BaseUnitOfWork.getAllT in C:\ Users \ Isaac.G \ Desktop \ svn.bolinger.ca \ Library Projects \ NHibernateUtilities \ NHibernateUtilities \ BaseUnitOfWork.cs:line 115 TestProject1.UnitTest1.TestMethod1()in C:\ Users \ Isaac.G \ Desktop \ svn.bolinger.ca \ Library Projects \ BaseSystemCore \ TestProject1 \ UnitTest1.cs:line 71

有没有人有过这个工作?

感谢

艾萨克

+0

可能重复:http://stackoverflow.com/questions/5028318/how-to-make-internal-mapping-class-for-nhibernate。发布异常消息和堆栈跟踪,如果这个问题的答案没有帮助。 – Dmitry

+0

最后,那家伙没有得到它的工作:( –

回答

7

NHibernate的3.2具有内置的代理供应商。我简单地看一下这些源代码,似乎他们使用这种格式:{0} ProxyAssembly。其中{0}是延迟映射类的类型名称。我还没有测试过它。尝试添加以下到您的AssemblyInfo.cs和你懒惰的类名称替换{0}:

[assembly: InternalsVisibleTo("{0}ProxyAssembly")] 

如果你仍然想使用的NHibernate的旧版本,你可以尝试使用这种(对城堡的字节代码提供者):

DynamicProxyGenAssembly2是由Castle实时生成的临时程序集。它包含从您的映射类(代理)派生的类。

+0

我不明白这个DynamicProxyGenAssembly2是什么,它不是一个DLL。其他组件中是否有组件? –

+0

这是一个临时生成的程序集,类似于.NET为xml序列化生成程序集。 – Dmitry

+0

我将如何获得其公钥? –

1

为了什么它的价值,这是我已经投入到T4。它会自动为我的实体生成所有InternalsVisibleTo属性。希望能帮助到你。这个问题的

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ assembly name="System.Core" #> 
<#@ assembly name="$(SolutionDir)\Domain\bin\Debug\Domain.dll" #> 
<#@ import namespace="System.Linq" #> 
<#@ output extension=".cs" #> 
using System.Runtime.CompilerServices; 

<# 
var publicType = typeof(Domain.Foo); 
var allTypes = publicType.Assembly.GetTypes(); 

var entityType = allTypes.Single(t => t.FullName == "Domain.Entities.Entity"); // my entity supertype 

foreach(var type in allTypes.Where(t => !t.IsAbstract && entityType.IsAssignableFrom(t))) 
{#> 
[assembly: InternalsVisibleTo("<#= type.Name #>ProxyAssembly")] 
<#}#> 
+0

这是真正的答案,谢谢! –