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<T> where T : class
{
...
}
public class GenericRepository<T> : IRepository<T> where T : class
{
...
}
public class BlogRepository : GenericRepository<BlogRepository>
{
...
}
Конфигурация XML в настоящий момент выполняется следующим образом:
<unity>
<!-- Aliases -->
<alias alias="BlogIRepository"
type="X.Services.Interfaces.IRepository[[X.Domain.Entities.Blog, X.Domain]], X.Services"/>
<alias alias="BlogRepository"
type="X.Repositories.BlogRepository, X.Repositories"/>
<!-- Type registration -->
<container name="development">
<!-- Common connection string value -->
<instance name="Conn" type="System.String" value="blahblahblah"/>
<register type="BlogIRepository" mapTo="BlogRepository">
<constructor>
<param name="connectionString" type="System.String" dependencyName="Conn"/>
</constructor>
</register>
</container>
</unity>
В соответствии с документацией для регистрации общих типов вы используете квадратные скобки вокруг родовых типов (типов), и если тип не является типом системы, вы предоставляете полностью квалифицированный тип внутри большего квадратного скобки. Это то, что я сделал, я думаю. Тем не менее - без труда.
EDIT: пример с сайта MSDN:
<register type="IDictionary[string, [MyApp.Interfaces.ILogger, MyApp]]"/>
Созданная ошибка:
Невозможно разрешить имя типа или псевдоним IRepository. Проверьте конфигурационный файл и проверьте его имя.
Ответы
Ответ 1
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. В другом месте вы можете использовать общий синтаксис ярлыков.
Ответ 2
вам не хватает символа перед [[
(ниже Esc на моей клавиатуре)
Ответ 3
Я думаю, вам нужно добавить `1, поскольку примеры здесь, на MSDN, предполагали бы:
type="X.Services.Interfaces.IRepository`1[[X.Domain.Entities.Blog, X.Domain]], X.Services"