3

背景: 这是我第一个使用存储库、服务和实体框架的项目。现在我专注于数据层,以及我应该如何构建它。我只是在使用 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);
    }
}

存储库.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 question 说 global DbContext 是一个坏主意。所以现在我想知道,我将如何回答如何从我的持续服务中获取最新信息的问题。

谢谢你的时间,我很感激。

4

2 回答 2

1

1)我在 WPF 方面不是太有经验,但我记得可以将一些控件直接绑定到数据库(数据绑定)。在这种情况下,您甚至不需要您的存储库模式。

2)无论如何,您的通用存储库实现得很好。恕我直言,我更喜欢只定义DbContext受保护的字段。我认为IDbSet<TEntity>字段是多余的,因为您可以通过上下文访问它(就像您在构造函数中所做的那样)。所以,而不是使用

entities.Add(entity); 

你可以使用这个:

dbContext.Set<TEntity>().Add(entity);

此外,如果您想在所有存储库之间共享一个上下文,则有一种称为Unit Of Work的好模式。只是谷歌:通用存储库+工作单元+ EF。简而言之,它是您使用的所有存储库的包装类。您只需将您的上下文对象传递给工作单元构造函数,它就会在存储库之间共享。因此,当您调用Save Changes您使用任何回购协议更改的所有内容时,会同时保存。

而且我认为您需要定义自己的上下文(从 DbContext 继承)并可能为其接口,因此您可以引入依赖注入。

希望这可以帮助!

编辑:看看这个问题和答案https://stackoverflow.com/questions/19295977/repository-service-design-pattern/19296295#19296295

于 2013-10-10T06:36:55.003 回答
1

答案#1 是的,您是正确的,服务与存储库对话,而 WPF 应用程序将仅与服务通信。不应该直接在 ViewModels 中使用存储库,这是不可取的。

Answer#2 当您访问这些存储库时,您可以创建一个新的 DbContext 实例来获取最新数据,或者使用现有的 DbContext 实例(您在更新数据库之前创建的实例)。如果您使用新实例,那么您将获得最新数据。但是,如果您使用现有的 DbContext,那么它将获取旧数据。

于 2013-10-10T06:32:36.620 回答