类型不使用Unity [MVC 5]解析 [英] Types not resolving with Unity [MVC 5]

查看:148
本文介绍了类型不使用Unity [MVC 5]解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用ASP.NET MVC 5使用统一3 并的团结引导程序的ASP.NET MVC

I am using ASP.NET MVC 5 with Unity 3 and Unity bootstrapper for ASP.NET MVC.

在UnityConfig.cs文件,我注册了RegisterTypes方法如下类型:

In the UnityConfig.cs file, I registered the following type in the RegisterTypes method:

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<IProjectRepository, ProjectRepository>();
}

在一个MVC控制器,我解决这样的:

In an MVC controller, I am resolving like this:

UnityContainer container = new UnityContainer();

public ActionResult List()
{
    var projectRepository = container.Resolve<IProjectRepository>();

    return View(projectRepository.GetAll());
}

但我得到了以下异常:

But I am getting the following exception:

System.InvalidOperationException :类型IProjectRepository没有
  可访问的构造函数。

System.InvalidOperationException: The type IProjectRepository does not have an accessible constructor.

在我注册控制器内部的类型,那么它的作品完美,所以在某种程度上团结就是忘记什么是在 UnityConfig.RegisterTypes定义()

When I register the type inside the controller, then it works perfectly, so somehow unity is forgetting about what was defined in UnityConfig.RegisterTypes().

我把 UnityConfig.RegisterTypes一个破发点(),该方法被调用。

推荐答案

您没有获得注册的依赖,因为你实际上是创建其中没有关于注册的类型的任何信息UnityConfig.RegisterTypes()新的容器。

You are not getting registered dependency because you are actually creating new container which does not have any information about registered types in UnityConfig.RegisterTypes().

您可以用获取当前统一的容器,例如构造函数注入

You can get current unity container for example using constructor injection

IUnityContainer container;
public MyController(IUnityContainer _container)
{
    container = _container;
}

编辑:另外在我更好的去耦看来,这是最好不要直接使用的容器。您可以使用相同的构造器注入容易初始化你的库对象。

Also in my opinion for better decoupling it is better not to use container directly. You can easily initialize you repository object using the same constructor injection.

IProjectRepository projectRepository;
public MyController(IProjectRepository _projectRepository)
{
    projectRepository = _projectRepository;
}

第二种方法要好得多,因为你没有连接到任何特定的依赖注入。在未来,如果你需要改变依赖注入你不需要改变控制器code。

Second approach is much better because you are not coupled to any particular dependency injector. In future if you need to change dependency injector you won't need to change controller code.

这篇关于类型不使用Unity [MVC 5]解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆