使用单独创建DbContext失败并使用其他ctr

时间:2017-08-08 17:13:50

标签: c# entity-framework unity-container

我有自定义的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不能让它工作。可能我不知道团结是如何运作的,所以欢迎任何提示:)

1 个答案:

答案 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")));