繁体   English   中英

带有Ninject C#的EF DbContext工厂

[英]EF DbContext Factory with Ninject C#

我正在寻找有关重新构造我已经编写的现有C#控制台应用程序的最佳方法的一些建议。 该应用程序将数据的实体框架与存储库模式结合使用。 我也使用Ninject进行DI。 我面临的问题如下:

我有一个类,例如ClassA,它具有通过构造函数传递的存储库。 存储库构造函数采用DbContext。 Ninject目前正在为我处理所有这一切。

public class ClassA
{
  private IRepository Repository;

  public ClassA(IRepository repostitory)
  {
    Repository = repository;
  }

  public void Process()
  {
    var RV = Function1();
    Function2(RV);
    Function3(RV);
  }

  private IList<ClassB> Function1()
  {
    //Populate database using Repository and return list of objects

    var items = //Call External Web Service to get list of Items

    foreach(var item in items)
    {
      Repository.AddEntry(item);
    }

    return Repository.Items.ToList();
  }

  private void Function2(IList<Item> items)
  {
    //Long running process maybe 20/30 mins.
  }

  private void Function3(IList<Item> items)
  {
    //Remove objects in list from database via the Repository.

    foreach(var item in items)
    {
      Repository.DeleteEntry(item);
    }
  }
}

public class Repository : IRepository
{
  private DbContext DbContext;

  public IQueryable<Item> Items
  {
    get { return DbContext.Items; }
  }

  public Repository(DbContext dbContext)
  {
    DbContext = dbContext;
  }

  void AddEntry(Item item)
  {
    DbContext.Items.Add(item);
    DbContext.SaveChanges();  
  }

  void DeleteEntry(Item item)
  {
    DbContext.Items.Remove(item);
    DbContext.SaveChanges();
  }
}

然后,ClassA具有一个通过一系列3个私有函数工作的过程函数。

只有功能1和3才需要访问存储库,因为1通过存储库填充数据库,然后返回内存中的集合。 功能2使用此集合,然后功能3通过存储库从数据库中删除记录。

函数2可能需要几分钟才能完成,并且我注意到的行为是,当函数3调用数据库时,我收到“ DbContext已被处置”错误。 它没有在我的任何代码中处理,但似乎在同一SQL Server上运行的另一个进程导致了此情况。

为了解决此问题,我希望能够在功能1之后处理存储库,然后对功能3使用新的存储库,因此从本质上讲,将代码1和3中的代码包装在using语句中。 这是我在尝试使用Ninject时想出这种情况的时候开始感到头疼的时候。

我应该将什么作为构造函数的一部分传递给ClassA,以允许我即时创建Repostitories? 我需要某种工厂模式或工作单元模式吗?

任何帮助或想法都将不胜感激。

谢谢

pf79

您可以将DbContext注入工厂而不是实例本身,请看一下: https : //github.com/vany0114/EF.DbContextFactory

http://elvanydev.com/EF-DbContextFactory/

Ninject有一个扩展,以一种非常简单的方式实现,只需调用方法kernel.AddDbContextFactory<YourContext>(); 您还需要通过接收Func<YourContext>来更改存储库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM