2017-08-08 13 views
0

我有自定义的DbContext从IdentityDbContext继承。类看起来是这样的:创建与团结失败与额外的Ctr的DbContext

public class ReaderContext : IdentityDbContext<IdentityUser> 
{ 
    //DbSets 

    public ReaderContext() 
     : base("name=ReaderDb") 
    { 
     System.Data.Entity.Database.SetInitializer<ReaderContext>(null); 
     Database.Initialize(true); 
    } 
} 

当的DbContext看起来像这样,代码创建存储库(即使用ReaderContext)正常工作:(!不删除现有的)

container.RegisterType<IRepository, CustomRepository>(new HierarchicalLifetimeManager()); 
var repo = container.Resolve<IRepository>(); 

当我添加另一个构造到ReaderContext,创建CustomRepository不再适用于UnityContainer。

public ReaderContext(DbConnection connection) 
     : base(connection, true) 
    { 

    } 

我需要这样做,所以我可以moq上下文与努力。我正在使用Unity容器。除了我在:

2017年8月7日19:02:57.9256:异常: Microsoft.Practices.Unity.ResolutionFailedException:在 依赖解析失败,类型= “DataAccess.Database.Repositores .IRepository“,名称= ”(none)“。发生异常时:解析时。例外情况是: 出现InvalidOperationException - 当前类型, System.Data.Common.DbConnection,是一个抽象类,不能 构成。你是否缺少类型映射? -----------------------------------------------在异常的时间,该容器是:

解决 DataAccess.Database.Repositores.CustomRepository,(无) (从 DataAccess.Database.Repositores.IRepository映射,(无))
解决参数 “上下文”构造 DataAccess.Database.Repositores.CustomRepository(DataAccess.Database.ReaderContext 上下文) 解决DataAccess.Database.ReaderContext,的(无) 解析构造DataAccess.Database.ReaderContext(System.Data.Common的参数的 “连接”。 DbConnection 连接) 解决System.Data.Common.DbConnection,(无)---> System.InvalidOperationException:当前类型, System.Data.Common.DbConnection,是一个抽象类,不能被 构造。你是否缺少类型映射?

为什么添加新的构造函数打破统一配置?此外,我尝试从头开始设置统一,但coudn't使它的工作。也许我不知道如何团结工作,所以任何建议,欢迎:)

回答

1

默认情况下,统一将选择的参数最多的构造函数。所以,最初使用无参数的构造函数,一切都很好。

但是,当您添加ReaderContext(DbConnection connection)构造函数,构造了现在的参数最多的构造函数,因此统一选择使用它。对于该构造,团结看见它需要一个DbConnection但是,作为异常消息表明,DbConnection是抽象如此团结不能实例并没有类型映射从抽象DbConnection到具体的非抽象类,团结可以实例。

解决的办法是明确地告诉你团结想让它做什么。如果你想使用paramterless构造函数,你会通过提供InjectionConstructor不带参数做到这一点:

container.RegisterType<ReaderContext>(new InjectionConstructor()); 

如果你想使用DbConnection构造函数,你要么必须与明确配置统一如何构建一个ReaderContext或配置Unity以及如何解析摘要DbConnection。我会典型地使用后一种方法并配置映射,并让Unity构建对象图:

container.RegisterType<DbConnection, SqlConnection>(
    new InjectionFactory(c => new SqlConnection("connectionString"))); 
+0

太糟糕了,我无法赞扬更多,很好的答案。 “默认情况下,Unity将选择具有最多参数的构造函数。”非常感谢 –