Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从一个中心类提供不同的数据访问接口:是否有我可以/应该使用的模式?_C#_Design Patterns_Data Access - Fatal编程技术网

C# 从一个中心类提供不同的数据访问接口:是否有我可以/应该使用的模式?

C# 从一个中心类提供不同的数据访问接口:是否有我可以/应该使用的模式?,c#,design-patterns,data-access,C#,Design Patterns,Data Access,我想开始重写(一步一步)旧应用程序中的数据访问层。我们使用实体框架作为对象关系映射器,因此“纯数据访问”已经完成。仍然需要做的是为“下一个”层(我这样称呼它是因为现在还不清楚旧的业务层是否会保留下来;这可能会导致一个问题,我所说的方法应该放在哪里,分层)提供必要的方法来获取它所需的数据 因为需要很多方法,所以把它们都放在一个巨大的接口/类中对我来说似乎不是正确的方法。我更倾向于将这些“获取数据”方法按主题分开。就是这样, interface IBillDataAccess { .. } inte

我想开始重写(一步一步)旧应用程序中的数据访问层。我们使用实体框架作为对象关系映射器,因此“纯数据访问”已经完成。仍然需要做的是为“下一个”层(我这样称呼它是因为现在还不清楚旧的业务层是否会保留下来;这可能会导致一个问题,我所说的方法应该放在哪里,分层)提供必要的方法来获取它所需的数据

因为需要很多方法,所以把它们都放在一个巨大的接口/类中对我来说似乎不是正确的方法。我更倾向于将这些“获取数据”方法按主题分开。就是这样,

interface IBillDataAccess { .. }
interface IAttestationDataAccess { .. }
interface ICustomerDataAccess { .. }
等等

(1) 您认为在这里使用接口有用吗(我认为是的),即使这些接口的实现不太可能改变?我必须向接口和实现添加新方法

(2) 我通常会将这些接口的具体实现的创建累积到一个“提供者”类中,就像我以前在许多较小的项目中看到的那样。通常看起来是这样的(,但现在我有了更多的接口):

关于这个设计的一些东西困扰着我,尽管我无法确定。我相信你的意见会对我有所帮助

另一点(与(1)相交):我还不确定是否喜欢
DataAccess
类不是静态的。但是如果有静态类,这就意味着我不能使用任何接口

我很感谢大家对这方面的意见,因为我对这一切真的很不安全,不幸的是,我通常会问的人暂时不在这里。请随意怀疑和批评我在上面所做的任何事情;)

您正在搜索并利用交易使用

公共接口i假设,其中T:class
{
IQueryable GetAll();
T GetById(对象id);
无效插入(T实体);
无效更新(T实体);
}
您也可以在这里使用存储库模式和工作单元模式

 public class Repository<T>:IRepository<T> where T:class
    {
        private DbContext context = null;
        private DbSet<T> dbSet = null;

        public Repository(DbContext context)
        {
            this.context = context;
            this.dbSet = context.Set<T>();
        }

        #region IRepository

        public void Insert(T entity)
        {
            dbSet.Add(entity);
        }

        public IQueryable<T> GetAll()
        {
            return dbSet;
        }

        public void Update(T entity)
        {
            if (entity == null)
                throw new ArgumentNullException("entity");

            this.context.SaveChanges();
        }

       #endregion
    }
公共类存储库:IRepository,其中T:class
{
私有DbContext上下文=null;
私有DbSet DbSet=null;
公共存储库(DbContext上下文)
{
this.context=上下文;
this.dbSet=context.Set();
}
#区域负性
公共无效插入(T实体)
{
添加(实体);
}
公共IQueryable GetAll()
{
返回dbSet;
}
公共无效更新(T实体)
{
if(实体==null)
抛出新的ArgumentNullException(“实体”);
this.context.SaveChanges();
}
#端区
}

您可以在

中找到更多的工作示例,这看起来非常有趣,谢谢!不过,我还有一些问题:这在逻辑上仍然属于数据访问层,不是吗?这将推动我在长期运行的环境中工作,对吗?否则,我必须为每次数据访问创建一个新的
存储库
实例,并将其包装在一个带有新上下文的using语句中,这对我来说很尴尬。还是我误解了你们的意思?是的,它属于数据访问层,你们可以创建通用存储库。这样,就不需要为每次数据访问创建实例。检查链接并阅读文章的最后一部分
实现一个通用存储库和一个工作类单元
在我尝试用上面的内容编写一些测试代码之后,我发现我根本不需要用它来编写事务安全的数据访问,它只是感觉像一个不必要的抽象层。我尝试用这个模式做的每件事最终都变短了,并且基本上在短时间运行的上下文中也做了同样的事情。经过更多的阅读,我发现这对我来说非常有意义!
 public interface IRepository<T> where T:class
    {
        IQueryable<T> GetAll();
        T GetById(object id);
        void Insert(T entity);
        void Update(T entity);         
    }
 public class Repository<T>:IRepository<T> where T:class
    {
        private DbContext context = null;
        private DbSet<T> dbSet = null;

        public Repository(DbContext context)
        {
            this.context = context;
            this.dbSet = context.Set<T>();
        }

        #region IRepository

        public void Insert(T entity)
        {
            dbSet.Add(entity);
        }

        public IQueryable<T> GetAll()
        {
            return dbSet;
        }

        public void Update(T entity)
        {
            if (entity == null)
                throw new ArgumentNullException("entity");

            this.context.SaveChanges();
        }

       #endregion
    }