Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC控制器从何处获得&x27;在运行时创建数据库上下文_Asp.net Mvc_Dependency Injection_Mocking_Unity Container_Eisk - Fatal编程技术网

Asp.net mvc MVC控制器从何处获得&x27;在运行时创建数据库上下文

Asp.net mvc MVC控制器从何处获得&x27;在运行时创建数据库上下文,asp.net-mvc,dependency-injection,mocking,unity-container,eisk,Asp.net Mvc,Dependency Injection,Mocking,Unity Container,Eisk,鉴于此代码: namespace Eisk.Controllers { public class EmployeesController : Controller { DatabaseContext _dbContext; public EmployeesController(DatabaseContext databaseContext) { _dbContext = databaseContext;

鉴于此代码:

namespace Eisk.Controllers
{
    public class EmployeesController : Controller
    {
        DatabaseContext _dbContext;

        public EmployeesController(DatabaseContext databaseContext)
        {
            _dbContext = databaseContext;
        }

        public ViewResult Index()
        {
            var employees = _dbContext.EmployeeRepository;

            return View(employees.ToArray());
        }
请注意,构造函数不会新建数据库

当从单元测试访问时,我可以注入databaseContext,控制器将在测试期间使用它。我搞不清楚的是,这段代码在运行时从何处获取它所使用的数据库上下文。如果我能发现这一点,我也许能够想出如何避免这种行为,并让它使用模拟/内存中的数据库

更多说明: 我现在无法访问此应用程序的遗留数据库,因此我尝试模拟一个内存中的数据源,该数据源由xml文件填充。这就是为什么我需要能够绕过默认的数据库上下文创建

更多信息: 谢谢你们到目前为止所给予的帮助,你们真是太棒了

史蒂文似乎把我引向了正确的道路。 在Global.asax文件中有以下调用:

DependencyInjectorInitializer.Init();
接下来,通过代码,我可以:

        public static void Initialize()
    {
        _container = new UnityContainerFactory().CreateConfiguredContainer();     
        var serviceLocator = new UnityServiceLocator(_container);
        ServiceLocator.SetLocatorProvider(() => serviceLocator);
        DependencyResolver.SetResolver(new UnityDependencyResolver(_container));
    }
至少这让我朝着正确的方向前进。现在我必须弄清楚Unity是如何创建上下文的,这样我才能进行干预

  • 让我在这里插入EISK MVC员工信息入门工具包。这是一个由Mohammad Ashraful Alam等人开发的经过深思熟虑的系统,其中包括一个成熟的例子,说明了有多少新技术可以结合在一起。MVC5、实体框架6、Unity、身份验证、OpenAuth、DI、Moq和其他一些东西。可以用作模板、一般学习或培训。

对于ASP.NET MVC的默认配置,控制器应具有默认构造函数(即不带参数的公共构造函数)。如果不是,ASP.NET MVC将引发以下异常:

类型“Eisk.Controllers.EmployeesController”没有默认值 建造师

但是,如果这样做有效,则意味着您(或其他开发人员)通过使用自定义
IControllerFactory
或自定义
IDependencyResolver
重写默认配置。大多数开发人员通过使用开源依赖项注入库(如Simple Injector、Autofac或Castle Windsor)来实现这一点。如果您为这样的库引入NuGet MVC集成包,它通常会为您进行此配置。所以你团队中的某个人可能为你做了这件事


我的建议是:与您的团队交谈,询问他们是如何做到这一点的,他们使用了哪个容器,以及在哪里可以找到该容器的配置。

检查您的web.config文件,我想这就是您要问的。。。。你的意思是上下文正在使用什么连接字符串?你的意思是不新建数据库?你在使用什么DI框架-Ninject,StructureMap,Castle Windsor?我不认为这是一个必要的DI框架问题,我一开始以为是这样,但它没有说IDatabaseContext,所以你需要做的就是导航到DatabaseContext代码并查看其中的内容,它将指定要使用的连接字符串,如果该类中没有任何内容,则if在web中应具有相同的名称。配置如果代码正常工作,请查找类DatabaseContext的所有实例。一个带有初始化代码的将回答您的问题。正如stephen指出的,它应该在DI初始化类中的某个地方@DatabaseContext可能是一个抽象类,使DI进入画面吗?ScottSelby是正确的,因为这不是一个真正的DI框架问题。我认为这对于Microsofts MVC来说是非常特殊的,因为从控制器继承是在某种程度上为我做工作。这几乎就是问题所在。控制员是怎么做到的?我相信你做到了,史蒂文。在Global.asax文件中,设置Unity。下面是“和你的团队谈谈……”嗯,这不是我们写的。我正在使用EISK员工信息入门工具包作为模板。事实证明,它非常有助于我快速理解MVC、EntityFramework、DI和其他一些东西。在这里找到它: