2011-08-22 47 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

這是真正的答案,謝謝! –