entity-framework – 将DbContext注入Repository类库

前端之家收集整理的这篇文章主要介绍了entity-framework – 将DbContext注入Repository类库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的解决方案中的项目设置如下:

> App.Data
> App.Models
> App.Web

在App.Data中,我使用Entity Framework通过一堆存储库访问我的数据以抽象与它的交互.出于显而易见的原因,我希望我的App.Web仅引用App.Data项目,而不是Entity Framework.

我正在使用构造函数注入为我的控制器提供对如下所示的Repository容器的引用:

  1. public interface IDataRepository
  2. {
  3. IUserRepository User { get; set; }
  4. IProductRepository Product { get; set; }
  5.  
  6. // ...
  7. }
  8.  
  9. public class DataRepository : IDataRepository
  10. {
  11. private readonly AppContext _context;
  12.  
  13. public DataRepository(AppContext context)
  14. {
  15. _context = context;
  16. }
  17.  
  18. // ...
  19. }

DataRepository将有一个AppContext对象(继承自Entity Framework的DbContext),所有子存储库将使用它来访问数据库.

最后我们来讨论我的问题:我如何在DataRepository上使用Constructor Injection,因为它是一个代码库并且没有入口点?我无法在App.Web中引导AppContext,因为那时我必须从该项目引用Entity Framework.

或者我只是在做一些愚蠢的事情?

解决方法

您可以在App.Data中定义RepositoryConnection类,该类充当Context的包装器,并且无需在App.Web中引用EF.如果您使用的是IoC容器,则可以控制RepositoryConnection类的生命周期,以确保Repository的所有实例都获得相同的Context.这是一个简化的例子……
  1. public class RepositoryConnection
  2. {
  3. private readonly AppContext _context;
  4.  
  5. public RepositoryConnection()
  6. {
  7. _context = new AppContext();
  8. }
  9.  
  10. public AppContext AppContext { get { return _context; } }
  11. }
  12.  
  13. public class DataRepository : IDataRepository
  14. {
  15. private readonly AppContext _context;
  16.  
  17. public DataRepository(RepositoryConnection connection)
  18. {
  19. _context = connection.AppContext;
  20. }
  21.  
  22. // ...
  23. }

猜你在找的asp.Net相关文章