Unity 2.0 регистрация общих типов через XML - PullRequest
10 голосов
/ 15 августа 2010

Я пытаюсь зарегистрировать универсальный тип в конфигурационном файле для 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>

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

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

<register type="IDictionary[string, [MyApp.Interfaces.ILogger, MyApp]]"/>

Произошла ошибка:

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

Ответы [ 3 ]

19 голосов
/ 22 августа 2010

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. В любом другом месте вы можете использовать общий синтаксис.

3 голосов
/ 16 августа 2010

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

1 голос
/ 16 августа 2010

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

type="X.Services.Interfaces.IRepository`1[[X.Domain.Entities.Blog, X.Domain]], X.Services"
...