Я пытаюсь отобразить универсальный тип для Unity - PullRequest
2 голосов
/ 08 апреля 2009

Я пытаюсь добавить зависимость к свойству класса, используя Unity Configuration, а также типы, которые я пытаюсь внедрить, являются общими. У меня был "Google" и я обнаружил, что мне нужно использовать синтаксис '1. Я следую руководству Дэвида Хейдена о блоке приложения проверки, НО, вместо того, чтобы программно регистрировать тип, который я настраиваю, через файл конфигурации.

<typeAliases>
    <!-- Lifetime manager types -->
    <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" />
    <typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,Microsoft.Practices.Unity" />
    <typeAlias alias="IValidator`1" type="MySerivice.IValidator`1,MyService" />
    <typeAlias alias="VABValidator`1" type="MySerivice.VABValidator`1,MyService" />
    <typeAlias alias="MyService" type="MySerivice.MyService,MyService" />
</typeAliases>

Тогда я регистрирую сопоставления и свойства здесь:

<types>    
  <type type="MyService">
    <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement Microsoft.Practices.Unity.Configuration">
      <property name="Validator" propertyType="IValidator`1"/>
    </typeConfig>
  </type>
  <type type="IValidator`1" mapTo="VABValidator`1">
    <lifetime type="singleton" />
  </type>
</types>

Внутри MyService у меня есть следующее свойство:

private IValidator<RegExpressionObject> validator;

[Dependency]
public IValidator<RegExpressionObject> Validator
{
    get { return validator; }
    set { validator = value; }
}

Когда я запускаю это, я получаю следующее исключение, которое действительно заставляет меня почесать голову:

System.InvalidOperationException: Свойство Validator по типу MyService относится к типу IValidator'1 и не может быть вводится со значением типа IValidator'1

Любая помощь очень ценится.

1 Ответ

2 голосов
/ 10 апреля 2009

Я полагаю, вы ищете этот синтаксис:

<typeAlias alias="VABValidator`1" 
           type="MySerivice.VABValidator`1
                [[Assembly.Namespace.RegExpressionObject,Assembly]],MyService"/>

Это укажет тип вашего универсального параметра и позволит вам ввести его.

Эта функциональность не очень хорошо документирована:)

...