背景 这是我的第一个使用存储库,服务和实体框架的项目。现在我专注于数据层,以及我应该如何构建它。我只是使用SQLite,但我需要Dropbox以及将JSON对象读/写到本地存储的能力,所以我希望通过创建数据层我可以稍后添加这些功能。
我有什么:
IRepository.cs
using System;
namespace Premier.Data.Repositories
{
public interface IRepository<TEntity> where TEntity : class
{
void Create(TEntity entity);
void Remove(TEntity entity);
void Update(TEntity entity);
}
}
Repository.cs
using System;
using System.Data;
using System.Data.Entity;
using System.Linq;
namespace Premier.Data.Repositories
{
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
protected DbContext context;
protected IDbSet<TEntity> entities;
public Repository(DbContext dbContext)
{
context = dbContext;
entities = dbContext.Set<TEntity>();
}
public void Create(TEntity entity)
{
entities.Add(entity);
}
public void Update(TEntity entity)
{
entities.Attach(entity);
context.Entry(entity).State = EntityState.Modified;
}
protected IQueryable<TEntity> Query()
{
return entities;
}
public void Remove(TEntity entity)
{
entities.Remove(entity);
}
}
我不明白的事情:
根据我的阅读,服务与存储库进行通信,我的WPF项目将只与服务进行通信。 这是正确的,还是视图模型也会访问存储库?
我在哪里访问这些存储库,如何确保DbContext具有最新数据?例如,在部门视图中,可以添加或删除部门。在此项目中运行的连续服务的每个时间间隔一旦可用(或在间隔时间内),就需要最新的详细信息。最初我打算使用工厂和单例之间的混合来创建存储库,让它们共享一个DbContext。但是,我读了一个SO问题,说全局DbContext是一个坏主意。所以现在我想知道,我将如何回答如何从我的连续服务中获取最新信息的问题。
感谢您的时间,我很感激。
答案 0 :(得分:1)
答案#1 是的,你是对的,服务与存储库对话,WPF应用程序只与服务通信。不应该直接在ViewModels中使用存储库,这是不可取的。
答案#2 当您访问这些存储库时,您可以创建DbContext的新实例以获取最新数据,也可以使用现有的DbContext实例(在更新数据库之前创建的实例)。如果您使用新实例,那么您将获得最新数据。但是如果你使用现有的DbContext,那么它将获取旧数据。
答案 1 :(得分:1)
1)我在WPF方面没有太多经验,但我记得可以将一些控件绑定到数据库(数据绑定)。在这种情况下,您甚至不需要您的存储库模式。
2)无论如何,你的通用存储库实现得很好。恕我直言,我更喜欢只定义DbContext
受保护的字段。我认为IDbSet<TEntity>
字段是冗余的,因为您可以通过上下文访问它(就像在构造函数中一样)。所以,而不是使用
entities.Add(entity);
您可以使用:
dbContext.Set<TEntity>().Add(entity);
此外,如果您想在所有存储库之间共享一个上下文,则有一个称为 工作单元 的良好模式。只需谷歌: 通用存储库+工作单元+ EF 。简而言之,它是一个围绕您使用的所有存储库的包装类。您只需将您的上下文对象传递给Unit Of Work构造函数,它就会在存储库之间共享。因此,当您致电Save Changes
时,您使用任何仓库进行查询的所有内容都会同时保存。
我认为你需要定义你自己的上下文(继承自DbContext)并可能是它的接口,所以你可以引入依赖注入。
希望这有帮助!
编辑:查看此问题并回答https://stackoverflow.com/questions/19295977/repository-service-design-pattern/19296295#19296295