多个构造函数-参数无法构造
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 脚本的数据来预加载这些数据。
在 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 脚本的数据来预加载这些数据。