我正在寻找关于重新构建我编写的现有C#控制台应用程序的最佳方法的一些建议。 该应用程序利用实体框架为数据与存储库模式相结合。我也在使用Ninject进行DI。 我面临的问题如下:
我有一个类,比如说ClassA,它有一个通过构造函数传入的Repository。存储库构造函数接受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调用数据库时,我收到了一个&#34; DbContext已被处理&#34;错误。它没有在我的任何代码中处理,但似乎在同一个SQL服务器上运行的另一个进程导致了这一点。
为了解决这个问题,我希望能够在函数1之后处理存储库,然后对函数3使用新的存储库,因此实质上将代码包装在函数1和1中。 3在使用声明中。这是当我在使用Ninject时试图找出这种情况时我的头开始受伤了。
作为构造函数的一部分,我应该将哪些内容传递给ClassA,以便我可以动态创建Repostitories?我是否需要某种工厂模式或工作单元模式?
感激不尽的任何帮助或想法。
由于
pf79
答案 0 :(得分:0)
您可以将DbContext注入工厂而不是实例perse,请看一下:https://github.com/vany0114/EF.DbContextFactory
http://elvanydev.com/EF-DbContextFactory/
Ninject有一个扩展,以非常简单的方式执行此操作,只需调用方法kernel.AddDbContextFactory<YourContext>();
,您还需要通过接收Func<YourContext>
来更改存储库