多个构造函数-参数无法构造

Multiple constructors -parameter cannot be constructed

在 ASP.Net MVC 站点的数据层中,我有以下 "default" 构造函数:

public class UserPrefsContext : DbContext
{
    private static ILog _logger =
        LogManager.GetLogger(
        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public UserPrefsContext()
        : base("Unit4.UserPrefsConString")
    {
        this.Configuration.LazyLoadingEnabled = false;

        _logger.DebugFormat("Connection string being used for UserPrefs db:{0}", Database.Connection.ConnectionString);
        Database.SetInitializer<UserPrefsContext>(null);

    }
}

我一直在使用 Unity 作为 IoC 容器和 Moq 来模拟注入到控制器中的数据上下文对象。这对于单元测试工作正常,但对于更广泛的集成测试(在网站和数据库之间)我希望上下文能够针对 "real" 测试数据库工作。

因此,我添加了以下第二个构造函数:

public UserPrefsContext(string testConString)
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Database.Connection.ConnectionString = testConString;

        _logger.DebugFormat("Connection string being used for UserPrefs db:{0}", Database.Connection.ConnectionString);
        Database.SetInitializer<UserPrefsContext>(null);
    }

我的测试工作正常,但是当我 运行 网站时,我现在收到错误消息 "The type String cannot be constructed. You must configure the container to supply this value"。似乎 "something" 正在尝试使用第二个构造函数创建一个 UserPrefsContext 对象。我的猜测是 "something" 是 System.Web.Mvc.DepnedencyResolver。这是来自网站根目录中 Bootstrapper.cs 文件的代码:

public class Bootstrapper
{
    public static IUnityContainer Initialise()
    {
        var container = BuildUnityContainer();
        log4net.Config.XmlConfigurator.Configure();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));

        return container;
    }

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();

        // register all your components with the container here
        // it is NOT necessary to register your controllers

        // e.g. container.RegisterType<ITestService, TestService>();    
        RegisterTypes(container);

        return container;
    }

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<IESBContext, ESBContext>();
        container.RegisterType<IConfigurationManager, WebConfigConfigurationManager>();
    }
}

请问我该如何解决?

我是从错误的方向接近这个的。

解决方案是为控制器使用单个无参数构造函数。集成测试项目现在调用引导程序 class 以确保统一创建所需的数据库上下文对象。

然后我将连接字符串添加到集成测试项目的 app.config 并将它们更改为指向每个上下文数据库的特殊测试实例。我可以使用在集成测试项目中保存为 .sql 脚本的数据来预加载这些数据。