Я пытаюсь зарегистрировать универсальный тип в конфигурационном файле для 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. Пожалуйста, проверьте ваш конфигурационный файл и проверьте это имя типа.
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. В любом другом месте вы можете использовать общий синтаксис ярлыков.
у вас отсутствует символ `перед [[
(под Esc на моей клавиатуре)
Я думаю, вам нужно добавить `1, как подсказывают примеры здесь, в MSDN :
type="X.Services.Interfaces.IRepository`1[[X.Domain.Entities.Blog, X.Domain]], X.Services"