Nhibernate сопоставил внутренние классы и InternalsVisibleTo - PullRequest
2 голосов
/ 22 августа 2011

Мой прокси-генератор испытывает проблемы с генерацией прокси для внутренних сопоставленных классов Nhibernate. Я попытался добавить их как видимые, используя InternalsVisibleTo в Assemblyinfo.cs, но это не похоже на работу. Хуже того, я не знаю, как определить, удалось ли мне даже подружиться с теми сборками прокси, которые мне нужны, потому что, если я изменю несколько чисел в открытом ключе сборок прокси в файле assemblyinfo.cs, ошибка не выдается.

Ошибка:

Метод тестирования TestProject1.UnitTest1.TestMethod1 вызвал исключение: NHibernate.HibernateException: создание экземпляра прокси не удалось ---> Castle.DynamicProxy.Generators.GeneratorException: Тип не является общедоступным, поэтому прокси не может быть создан. Тип: BaseSystemCore.Domain.Lot

StackTrace:

Castle.DynamicProxy.DefaultProxyBuilder.AssertValidType (Тип цели) Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy (Тип classToProxy, Тип [] AdditionalInterfacesToProxy, Опции ProxyGenerationOptions) Castle.DynamicProxy.ProxyGenerator.CreateClassProxy (Тип classToProxy, Тип [] AdditionalInterfacesToProxy, Опции ProxyGenerationOptions, Объект [] constructorArguments, Перехватчики IInterceptor []) NHibernate.ByteCode.Castle.ProxyFactory.GetProxy (идентификатор объекта, сеанс ISessionImplementor) NHibernateUtilities.BaseUnitOfWork.handleException (исключение e) в C: \ Users \ Isaac.G \ Desktop \ svn.bolinger.ca \ Библиотечные проекты \ NHibernateUtilities \ NHibernateUtilities \ BaseUnitOfWork.cs: строка 871 NHibernateUtilities.BaseUnitOfWork.getAllT в C: \ Users \ Isaac.G \ Desktop \ svn.bolinger.ca \ Библиотечные проекты \ NHibernateUtilities \ NHibernateUtilities \ BaseUnitOfWork.cs: строка 115 TestProject1.UnitTest1.TestMethod1 () в C: \ Users \ Isaac.G \ Desktop \ svn.bolinger.ca \ Библиотечные проекты \ BaseSystemCore \ TestProject1 \ UnitTest1.cs: строка 71

Кто-нибудь когда-нибудь заставлял это работать раньше?

Спасибо

Исаак

Ответы [ 2 ]

7 голосов
/ 22 августа 2011

NHibernate 3.2 имеет встроенный прокси-провайдер.Я кратко смотрю на источники, кажется, они используют этот формат: {0} ProxyAssembly.Где {0} - это имя типа для ленивого сопоставленного класса.Я не проверял это все же.Попробуйте добавить следующее в файл AssemblyInfo.cs и замените {0} на имя вашего ленивого класса:

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

Если вы все еще хотите использовать более старую версию NHibernate, вы можете попробовать использовать это (для провайдера кодового байта кода):

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

DynamicProxyGenAssembly2 - это временная сборка, которая генерируется Castle на лету.Он содержит классы, полученные из ваших сопоставленных классов (прокси).

2 голосов
/ 23 июня 2014

Для чего это стоит, это то, что я бросил в Т4. Он автоматически генерирует все атрибуты 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")]
<#}#>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...