Обновление Castle Windsor вызывает исключение TypeLoadException для универсальных типов - PullRequest
5 голосов
/ 03 июня 2010

В моем xml-файле Castle Windsor есть следующее сопоставление, которое некоторое время работало нормально (без изменений):

<component id="defaultBasicRepository"
           service="MyApp.Models.Repositories.IBasicRepository`1, MyApp.Models"
           type="MyApp.Models.Repositories.Linq.BasicRepository`1, MyApp.Models"
           lifestyle="perWebRequest"/>

Я получил это из документации по Виндзору в http://www.castleproject.org/container/documentation/v1rc3/usersguide/genericssupport.html.

Поскольку я обновил Windsor, теперь я получаю следующее исключение во время выполнения:

Описание: Необработанное исключение произошло во время исполнения текущий веб-запрос. Пожалуйста, просмотрите трассировка стека для получения дополнительной информации о ошибка и откуда она возникла код.

Сведения об исключении: System.TypeLoadException: GenericArguments [0], 'T', в 'MyApp.Models.Repositories.Linq.BasicRepository`1 [TEntity]' нарушает ограничение параметра типа 'TEntity'.

Ошибка источника:

Строка 44: открытый статический void ConfigureIoC ()
Строка 45: {
Строка 46: var windsor = new WindsorContainer ("Windsor.xml");
Строка 47:
Строка 48: ServiceLocator.SetLocatorProvider (() => новый WindsorServiceLocator (windsor));

Я использую ASP.NET MVC 1.0, Visual Studio 2008 и Castle Windsor, загруженные с http://sourceforge.net/projects/castleproject/files/InversionOfControl/2.1/Castle-Windsor-2.1.1.zip/download

Может кто-нибудь пролить свет на это? Я уверен, что обновление Castle Windsor - то, что вызвало это - это работало хорошо целую вечность.

UPDATE
Я исправил это сам в конце. Подробнее см. мой ответ ниже.

1 Ответ

8 голосов
/ 03 июня 2010

В конце концов я нашел ответ для себя, сравнив все классы / интерфейсы в отображении.

Ответ состоял в том, что аргумент универсального типа BasicRepository имел следующие ограничения:

public class BasicRepository<TEntity> : IBasicRepository<TEntity>
    where TEntity : class
{

... но интерфейс, который он реализовал, не имел такого же ограничения:

public interface IBasicRepository<T>
{

Я обновил интерфейс для соответствия:

public interface IBasicRepository<T>
    where T : class
{

и теперь все отлично работает.

Надеюсь, это кому-нибудь поможет. :)

...