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和其他一些东西。可以用作模板、一般学习或培训。
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和其他一些东西。在这里找到它: