不能构造多个构造函数 - 参数

时间:2017-11-30 14:47:32

标签: c# entity-framework inversion-of-control unity-container

在ASP.Net MVC站点的数据层中,我有以下“默认”构造函数:

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来模拟数据上下文对象,这些对象被注入到控制器中。这对于单元测试是有效的,但是对于更广泛的集成测试(在网站和数据库之间)我希望上下文能够与“真正的”测试数据库一起工作。

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

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);
    }

我的测试工作正常,但是当我运行网站时,我现在收到错误消息“无法构造类型字符串。您必须配置容器以提供此值”。似乎“某事”试图用第二个构造函数创建一个UserPrefsContext对象。我的猜测是“东西”是System.Web.Mvc.DepnedencyResolver。以下是网站root中的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>();
    }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

解决方案是为控制器提供单个无参数构造函数。集成测试项目现在调用bootstrapper类以确保unity创建所需的db上下文对象。

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