11
votes

I've just stumbled upon this:

within a Unity container, I want to register IDictionary<TK, TV>; assume that it's IDictionary<string, int>

_unityContainer = new UnityContainer()
    .RegisterType<IDictionary<string, int>, Dictionary<string, int>>();

but if I try

var d = _unityContainer.Resolve<IDictionary<string, int>>();

it fails to resolve...

I get...

Microsoft.Practices.Unity.ResolutionFailedException: Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "System.Collections.Generic.IDictionary`2[System.String,System.Int32]", name = "(none)". Exception occurred while: while resolving.

Exception is: InvalidOperationException - The type Dictionary`2 has multiple constructors of length 2. Unable to disambiguate.


At the time of the exception, the container was:

Resolving System.Collections.Generic.Dictionary2[System.String,System.Int32],(none) (mapped from System.Collections.Generic.IDictionary2[System.String,System.Int32], (none)) ---> System.InvalidOperationException: The type Dictionary`2 has multiple constructors of length 2. Unable to disambiguate..

So it looks like it has found the Type to resolve (being Dictionary<string, int>) but failed to new it up...

How come unity can't resolve this type? If I type

IDictionary<string, int> d = new Dictionary<string, int>()

that works...

any ideas?

thanks!

1

1 Answers

9
votes

Very interesting find +1. Seems like a bug in Unity, see here:

http://unity.codeplex.com/Thread/View.aspx?ThreadId=30292

You can also try this:

 container.RegisterType<IDictionary<int, string>, Dictionary<int, string>>
                (new InjectionConstructor());

That makes it use the default constructor, thus circumventing the issue...