Recently, I used Unity v1.2, which in my opinion is a great product. I had difficulty, however, with the configuration for a scenario I encountered. I needed an enum value to be passed to a constructor. Trying as I might, there was no way Unity was accepting my typeAlias, as such:
<unity> <typeAliases> <typeAlias alias="contextType" type="System.DirectoryServices.AccountManagement.ContextType, System.DirectoryServices.AccountManagement, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </typeAliases> <containers> <container name="identitystores"> <types> <type name="primary" type="IIdentityStore" mapTo="ActiveDirectoryIdentityStore" > <lifetime type="singleton" /> <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration"> <constructor> <param name="context" parameterType="contextType"> <value value="Domain" type="contextType" /> </param> </constructor> </typeConfig> </type> </types> </container> </containers> </unity>
For the life of me, I couldn’t figure out what I did wrong. I asked in an internal discussion list, and someone mentioned writing a plain old TypeConverter… Right he was, getting my enum value to work was pretty easy. The TypeConverter (as always, comments removed for clarity and provided AS IS, etc.):
public class ContextTypeTypeConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return sourceType.GetType() == typeof(string); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { return destinationType == typeof(ContextType); } public override object ConvertFrom( ITypeDescriptorContext context, CultureInfo culture, object value) { return Enum.Parse(typeof(ContextType), (string)value); } public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { return Enum.GetName(typeof(ContextType), value); } }
and modified configuration file:
<unity>
<typeAliases>
<typeAlias
alias="contextType"
type="System.DirectoryServices.AccountManagement.ContextType,
System.DirectoryServices.AccountManagement, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</typeAliases>
<containers>
<containername="identitystores">
<types>
<typename="primary" type="IIdentityStore" mapTo="ActiveDirectoryIdentityStore" >
<lifetimetype="singleton" />
<typeConfig
extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,
Microsoft.Practices.Unity.Configuration">
<constructor>
<param name="context" parameterType="string">
<value
value="Domain"
type="contextType"
typeConverter="Microsoft.AccountManagement.Extensions.ContextTypeTypeConverter,
Microsoft.AccountManagement.Extensions, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=4fd564a94067c21"/>
</param>
</constructor>
</typeConfig>
</type>
</types>
</container>
</containers>
</unity>
That’s it, now everything works just fine. HTH someone out there 🙂