我已经研究了很多,还没有找到“完美”的解决方案。存储库模式对于上下文短暂的MVC应用程序非常有效,因为上下文存在于短暂的控制器中,但是当您尝试将相同的结构应用于VM可以长期保存的wpf应用程序时,就会出现问题。
我过去使用过这种解决方案,它比我所看到的许多回购模式要简单得多,这些回购模式试图将事物抽象到极致,从而导致难以调试的代码量几乎无法读取。步骤如下...
- 为EDMX创建一个单独的项目以充当您的数据访问层
- 在同一项目下创建一个“存储库”文件夹
创建基类“ BaseRepository”以充当“工作单元”。IDisposable
将允许您在中使用它,using(){}
并且partial
将允许您实现其他存储库
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
创建另一个名为“ MyOtherRepository”的文件。创建相同的部分类,但根据您希望该文件包含的内容实现方法
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
现在,您可以在VM中执行此操作...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
这会将您的所有存储库归为一类,因此您不必处理单独的上下文。通过将方法分组到不同的文件中,它可以使您更好地管理不同的存储库,并有助于防止代码重复。最重要的是,您的上下文没有使用此模式就已经存在很短。
缺点是,对于较大的系统,您可能有很多方法绑定在您的存储库中。在这种情况下,一种解决方案是实施一些基本的通用命令,例如“查找”或“添加”,并在其各自的存储库中实施专门的命令。