2011-08-22 4 views
2

프록시 생성기에서 내부 매핑 된 Nhibernate 클래스에 대한 프록시를 생성하는 데 문제가 있습니다. assemblyInfo.cs에서 InternalsVisibleTo를 사용하여 표시를 추가하려고 시도했지만 작동하지 않는 것 같습니다. 더 나쁜 것은, 내가 원하는 프록시 어셈블리를 성공적으로 관리했는지 알 수없는 방법입니다. 왜냐하면 assemblyinfo.cs의 프록시 어셈블리 공개 키에서 몇 개의 숫자를 변경하더라도 오류가 발생하지 않기 때문입니다.Nhibernate 매핑 된 내부 클래스 및 InternalsVisibleTo

오류 : NHibernate.HibernateException : 유형이 공개되지 않으므로 프록시 : ---> Castle.DynamicProxy.Generators.GeneratorException 실패 프록시 인스턴스를 생성 예외를 던졌다 TestProject1.UnitTest1.TestMethod1

시험 방법 생성 할 수 없습니다. 타입 : BaseSystemCore.Domain.Lot

스택 트레이스 :

Castle.DynamicProxy.DefaultProxyBuilder.AssertValidType (입력 대상) Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy 성 (타입 classToProxy [] additionalInterfacesToProxy, ProxyGenerationOptions 옵션 형) .DynamicProxy.ProxyGenerator.CreateClassProxy NHibernate.ByteCode.Castle.ProxyFactory.GetProxy (개체 ID, ISessionImplementor 세션) NHibernateUtilities.BaseUnitOfWork (유형 classToProxy, 유형 [] additionalInterfacesToProxy, ProxyGenerationOptions 옵션, [] constructorArguments, IInterceptor [] 인터셉터 개체). C : \ Users \ Isaac.G의 handleException (예외 e) \ Desktop \ svn.bolinger.ca \ Library 프로젝트 \ NHibernateUtilities \ NHibernateUtilities \ BaseUnitOfWork.cs : 라인 871 C : \ Users \ Isaac.G \ Desktop \ svn.bolinger.ca \ Library 프로젝트 \ NHibernateUtilities의 NHibernateUtilities.BaseUnitOfWork.getAllT \ NHibernateUtilities BaseUnitOfWork.cs \ : C에서 115 TestProject1.UnitTest1.TestMethod1() : 라인 71

: \ 사용자 \ Isaac.G 바탕 화면 \ \ svn.bolinger.ca 도서관 프로젝트 \ \ BaseSystemCore \ TestProject1 UnitTest1.cs \

이전에 누구도이 작업을 할 수 있습니까?

감사

이삭

+0

가능한 중복 : http://stackoverflow.com/questions/5028318/how-to-make-internal-mapping-class-for-nhibernate. 이 질문에 대한 대답이 도움이되지 않으면 예외 메시지 및 스택 추적을 게시하십시오. – Dmitry

+0

결국, 그 남자는 작동하지 않았다. ( –

답변

7

NHibernate에 3.2 프록시 제공자를 내장하고있다. 나는 그들이 {{}} ProxyAssembly와 같은 형식을 사용하는 것처럼 소스를 간략히 살펴 본다. 여기서 {0}은 지연 매핑 된 클래스의 유형 이름입니다. 나는 그것을 시험하지 않았다. 추가 귀하의 AssemblyInfo.cs에 다음을 시도하고 게으른 클래스 이름 {0}을 (를) 대체 : 당신은 아직도 당신이 사용해 볼 수 있습니다 NHibernate에의 이전 버전을 사용하려면

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

이 (성 바이트 코드 공급자에 대한) :

DynamicProxyGenAssembly2는 성에서 즉시 생성되는 임시 어셈블리입니다. 여기에는 매핑 된 클래스 (프록시)에서 파생 된 클래스가 포함됩니다.

+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

이것은 진짜 대답입니다, 감사합니다! –