Unity 2.0, регистрирующий универсальные типы через XML

Я пытаюсь зарегистрировать универсальный тип в конфигурационном файле для Unity 2.0, но, похоже, не могу сделать это правильно. Я имел в виду документацию MS здесь: http://msdn.microsoft.com/en-us/library/ff660933%28v=PandP.20%29.aspx#_Generic_Types

Код выглядит следующим образом :

public interface IRepository where T : class
{
    ...
}

public class GenericRepository : IRepository where T : class
{
    ...
}

public class BlogRepository : GenericRepository
{
    ...
}

Конфигурация XML, имеющаяся у меня на данный момент, выглядит следующим образом:


    
    

    

    
    
        
        
        
            
                
            
        
    

В соответствии с документацией для регистрации универсальных типов вы используете квадратные скобки вокруг универсального типа (типов), и если тип не является системным типом, который вы предоставляете полностью определенный тип внутри более квадратной скобки. Что я и сделал, я думаю. Пока - без работы.

РЕДАКТИРОВАТЬ : Пример с сайта MSDN:


Сгенерирована ошибка:

Не удалось разрешить имя типа или псевдоним IRepository. Пожалуйста, проверьте ваш конфигурационный файл и проверьте это имя типа.

10
задан abatishchev 17 May 2011 в 14:58
поделиться

3 ответа

MSDN НЕ ошибочен. Мы специально добавили несколько правил синтаксического анализа, чтобы в большинстве случаев вам не приходилось вводить все символы '' и квадратные скобки.

Я собрал пример, который больше всего похож на ваш:

public interface IRepository<T> where T: class
{

}

public class GenericRepository<T> : IRepository<T> where T : class
{

}

public class BlogRepository : GenericRepository<Blog>
{

}

public class Blog
{

}

Моя XML-конфигурация выглядит так:

  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <namespace name="UnityConfigExample"/>
    <assembly name="UnityConfigExample"/>

    <container>
      <register type="IRepository[]" mapTo="GenericRepository[]" />
      <register type="IRepository[Blog]" mapTo="BlogRepository" />
    </container>
  </unity>

и просто работает.

Вы случайно не пытались использовать псевдоним для IRepository вместо поиска по пространству имен / сборке? Я получил следующее, чтобы работать с псевдонимами:

  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="IRepository" type="UnityConfigExample.IRepository`1, UnityConfigExample" />
    <alias alias="GenericRepository" type="UnityConfigExample.GenericRepository`1, UnityConfigExample"/>
    <alias alias="BlogRepository" type="UnityConfigExample.BlogRepository, UnityConfigExample"/>
    <alias alias="Blog" type="UnityConfigExample.BlogRepository, UnityConfigExample"/>

    <container>
      <register type="IRepository[]" mapTo="GenericRepository[]" />
      <register type="IRepository[Blog]" mapTo="BlogRepository" />
    </container>
  </unity>

Когда вы указываете тип для псевдонима, вы должны использовать синтаксис типа CLR. В любом другом месте вы можете использовать общий синтаксис ярлыков.

19
ответ дан 3 December 2019 в 17:18
поделиться

у вас отсутствует символ `перед [[ (под Esc на моей клавиатуре)

3
ответ дан 3 December 2019 в 17:18
поделиться

Я думаю, вам нужно добавить `1, как подсказывают примеры здесь, в MSDN :

type="X.Services.Interfaces.IRepository`1[[X.Domain.Entities.Blog, X.Domain]], X.Services"
1
ответ дан 3 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: