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
}