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"