OopsImAlive
OopsImAlive

Reputation: 33

Unity.Mvc3 Resolve type of Interface<T>

I'm using Unity.Mvc3 in my project and it has embedded UnityDependencyResolver.

var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));

and the BuildUnityContainer method looks like:

private static IUnityContainer BuildUnityContainer()
{
    var container = new UnityContainer()
        .RegisterType<IControllerActivator, HControllerActivator>()
        .RegisterType<IDatabaseFactory, DatabaseFactory>(
            new HierarchicalLifetimeManager())
        .RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager())
        .RegisterType<IRepository<Article>, HRepository<Article>>()
        .RegisterType<IRepository<ContentBase>, HRepository<ContentBase>>()
        .RegisterType<IRepository<User>, HRepository<User>>()
        .RegisterType<IRepository<Profile>, HRepository<Profile>>();

    container.RegisterControllers();

    return container;
}

but when I try to resolve my type like this:

var users = DependencyResolver.Current.GetService<IRepository<User>>();

I get the following exception:

Resolution of the dependency failed, type = "Data.IRepository1[Data.Models.User]", name = "(none)". Exception occurred while: while resolving. Exception is: InvalidOperationException - The type HRepository1 cannot be constructed. You must configure the container to supply this value.

What am I doing wrong? And is it actually possible to use .RegisterType<IFoo<T>, Foo<T>>()? Maybe I need some kind of custom DependencyResolver?

Thanks in advance :)

Upvotes: 3

Views: 1053

Answers (1)

John Allers
John Allers

Reputation: 3122

What you are trying to do do should be possible. Unity may not know how to build HRepository<T>.

What does the HRepository<T> class look like? Specifically, what are the constructor parameters and do any of their types need to be registered with Unity?

Unity will not be able to resolve HRepository<T> if it does not know how to construct its parameters.

Upvotes: 2

Related Questions