2009-04-08 12 views
2

Ich versuche, eine Abhängigkeit zu einer Klasseneigenschaft mithilfe der Unity-Konfiguration hinzuzufügen, und auch die Typen, die ich injizieren möchte, sind generisch. Ich hatte ein "Google" über und fand, dass ich die 1-Syntax verwenden muss. Ich folge einem Tutorial von David Hayden über den Block der Validierungsanwendung, ABER statt den Typ programmatisch zu registrieren, stelle ich ihn über die Konfigurationsdatei auf.Ich versuche, einen generischen Typ für Unity zuzuordnen

<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> 

Dann registriere ich die Zuordnungen und Eigenschaften hier:

<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> 

Im Inneren des MyService ich die folgende Eigenschaft haben:

private IValidator<RegExpressionObject> validator; 

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

Wenn ich laufen diese aber ich die folgende Ausnahme erhalten, die macht mich wirklich kratzen meinen Kopf:

System.InvalidOperationException: Die Eigenschaft Validator auf Typen MyService ist vom Typ IValidator'1 und kann nicht mit einem Wert vom Typ IValidator'1 injiziert werden

Jede Hilfe sehr geschätzt.

Antwort

2

Ich glaube, du bist für diese Syntax suchen:

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

Das wird die Art Ihrer generischen Parameter angeben und lassen Sie es injizieren.

Diese Funktionalität ist nicht sehr gut dokumentiert :)

+0

Absolut Brilliant. Vielen Dank für Ihre Zeit. Es wird sehr geschätzt. :-) Spot an! –

Verwandte Themen