我想问一些有关依赖注入的帮助,我认为是架构方法。
所以,我有一个由EF6实现的ORM层,其中描述了对象,Ef做了它的业务,等等。我在它上面创建了一个名为DatabaseApi的自定义库,它在标题中被称为“Api”,其中我查询数据并将其映射到datacontract对象。我这样做是为了纯粹的测试目的。我希望我的应用程序中的不同库可以测试。
我开始实现注入DbContext的代码,但在这种情况下我不知道如何处理使用。
我浏览了一些关于模拟和EF的博文和文章,特别是this one,但它更像是测试EF本身而不是如何将其与其他库分离。另一方面,我认为我的搜索关键字不合适。
您是否知道有关如何将实体框架与其他库分离的任何优秀且可用的教程和文章?
提前致谢!
示例:
我创建了一个空接口,以便DbContext可以注入。它由databaseContext实现。
public interface IDatabase
{
}
public class DatabaseModelContext : DbContext, IDatabase{
public DbSet<TableOne> TableOne { get; set; }
public DbSet<TableTwo> TableTwo { get; set; }
}
在自定义Api库构造函数中,我整理了一个代码来解析Unity的接口。我不知道它是否有效。我还没有执行。
public partial class DatabaseApi : IDatabaseApi {
private readonly IDatabase iDatabase;
private readonly UnityContainer unityContainer;
public DatabaseApi()
{
this.unityContainer = new UnityContainer();
this.unityContainer.RegisterType<IDatabase, DatabaseModelContext>();
this.iDiLibDatabase = this.unityContainer.Resolve<IDiLibDatabase>();
}
}
这就是问题所在。由于我将拥有注入和接口,但据我所知,有一些对管理资源很重要的使用。怎么做?
public partial class DatabaseApi : IDatabaseApi
{
public List<SomeDataContract> GetMainStructure()
{
var result = new List<SomeDataContract>();
//this is the old implementation
using (var database = new DatabaseModelContext())
{
//some data manipulation magic... :)
}
return result;
}
答案 0 :(得分:1)
如果您可以使用linq将对象作为域访问层的核心元素,那么公开IQueryable以访问实体将会起作用......
public interface IRepository<TEntity>
{
IQueryable<TEntity> AllEntities { get; }
}
通过这种方式,您无需直接连接到EF就可以进行Where,Select等操作。在幕后,IRepository实现将处理EF部分,数据库连接等。在数据访问层没有避免与EF耦合。但是你可以使用你已经开始的东西将它限制在那一层。只需确保IRepository对象使用的数据库上下文是唯一使用EF的对象。
换句话说:没有你的IDatabase返回实体。只是让它处理连接,你应该为域对象访问创建另一个层,它接收一个IDatabase。在我给出的示例中,不知何故,IRepository实现将采用IDatabase的实例。
答案 1 :(得分:0)
因此,解决方案是使用Autofac DI框架。我找到了有趣的问题和答案以及两个非常有用的教程。以下链接: