我有自定义的DbContext,它继承自IdentityDbContext。类看起来像这样:
public class ReaderContext : IdentityDbContext<IdentityUser>
{
//DbSets
public ReaderContext()
: base("name=ReaderDb")
{
System.Data.Entity.Database.SetInitializer<ReaderContext>(null);
Database.Initialize(true);
}
}
当DbContext看起来像这样,创建Repository(使用ReaderContext)的代码工作正常:
container.RegisterType<IRepository, CustomRepository>(new HierarchicalLifetimeManager());
var repo = container.Resolve<IRepository>();
当我向ReaderContext添加另一个构造函数(不删除现有的构造函数!)时,在UnityContainer中创建CustomRepository不再有效。
public ReaderContext(DbConnection connection)
: base(connection, true)
{
}
我需要这样,所以我可以用Effort进行moq上下文。我使用的是Unity容器。我有以下例外:
2017-08-07 19:02:57.9256:异常: Microsoft.Practices.Unity.ResolutionFailedException:解析 依赖失败,type = &#34; DataAccess.Database.Repositores.IRepository&#34;,name = &#34;(无)&#34 ;.在解决时发生异常:例外情况是: InvalidOperationException - 当前类型, System.Data.Common.DbConnection,是一个抽象类,不可能 建造。你错过了类型映射吗? - - - - - - - - - - - - - - - - - - - - - - - - 当时例外,容器是:
解决 DataAccess.Database.Repositores.CustomRepository,(无) (映射自 DataAccess.Database.Repositores.IRepository,(none))
解析参数&#34; context&#34;构造函数 DataAccess.Database.Repositores.CustomRepository(DataAccess.Database.ReaderContext 上下文) 解析DataAccess.Database.ReaderContext,(无) 解析参数&#34;连接&#34;构造函数DataAccess.Database.ReaderContext(System.Data.Common.DbConnection 连接) 解析System.Data.Common.DbConnection,(无)---&gt; System.InvalidOperationException:当前类型, System.Data.Common.DbConnection,是一个抽象类,不可能 建造。你错过了类型映射吗?
为什么添加新的构造函数会破坏统一配置?此外,我尝试从头开始设置统一但是coudn不能让它工作。可能我不知道团结是如何运作的,所以欢迎任何提示:)
答案 0 :(得分:3)
默认情况下,Unity将选择具有最多参数的构造函数。所以,最初使用无参数构造函数,一切都很好。
但是,当您添加ReaderContext(DbConnection connection)
构造函数时,构造函数现在是具有最多参数的构造函数,因此Unity选择使用它。对于那个构造函数,Unity看到它需要DbConnection
但是,正如异常消息所示,DbConnection
是抽象的,因此Unity无法实例化它,并且没有从抽象DbConnection
到Unity可以实例化的具体非抽象类。
解决方案是明确告诉Unity您希望它做什么。如果你想使用无参数的构造函数,你可以通过提供一个没有参数的InjectionConstructor
来实现它:
container.RegisterType<ReaderContext>(new InjectionConstructor());
如果您想使用DbConnection
构造函数,则必须明确配置Unity以了解如何构建ReaderContext
或将Unity配置为如何解析抽象DbConnection
。我通常会使用后一种方法并配置映射,让Unity构建对象图:
container.RegisterType<DbConnection, SqlConnection>(
new InjectionFactory(c => new SqlConnection("connectionString")));