MVC Controller在运行时获取数据库上下文的位置

时间:2014-11-27 02:43:00

标签: asp.net-mvc dependency-injection mocking unity-container

鉴于此代码:

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 Et al开发的经过深思熟虑的系统。其中包括一个很好的例子,说明了有多少新技术融合在一起。 MVC 5,实体框架6,Unity,身份验证,OpenAuth,DI,Moq以及其他一些事情。可以用作模板,一般学习或培训。 Employee Info Starter Kit

1 个答案:

答案 0 :(得分:3)

使用ASP.NET MVC的默认配置,控制器应该有一个默认构造函数(即没有参数的公共构造函数)。如果不是ASP.NET MVC将抛出以下异常:

  

类型'Eisk.Controllers.EmployeesController'没有默认值   构造

如果这有效,则表示您(或其他开发人员)使用自定义IControllerFactory或自定义IDependencyResolver覆盖默认配置。大多数开发人员通过使用开源依赖注入库(例如Simple Injector,Autofac或Castle Windsor)来实现此目的。如果您为这样的库提供NuGet MVC集成包,它通常会为您执行此配置。所以你团队中的某些人可能会为你做这件事。

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