我正在使用。net Core 6开发具有微服务架构的服务。我尝试遵循干净的架构建议,并创建了3层,Core
(我放置我的用例,存储库接口和我的dto模型),API
层和infrastructure
(与DB的连接和存储库接口的实现)。
问题是存储库的数量正在增加,因为我为每个不同的作业创建了一个单独的存储库,例如IStoreCarPricesRepository
,IStoreCarSparePartRepository
,.....我在想,拥有一个通用的存储库并创建一个类来调用它,并且失业者说你从不同的队列中获得不同的消息并将它们存储在各自的表中,这不是更明智的吗?
到目前为止,我搜索的通用存储库有点过时,我将感谢您的评论
是的,你可以使用通用存储库:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.Entity;
using ContosoUniversity.Models;
using System.Linq.Expressions;
namespace DAL
{
public class GenericRepository<TEntity> where TEntity : class
{
internal SchoolContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(SchoolContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
public virtual TEntity GetByID(object id)
{
return dbSet.Find(id);
}
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = dbSet.Find(id);
Delete(entityToDelete);
}
public virtual void Delete(TEntity entityToDelete)
{
if (context.Entry(entityToDelete).State == EntityState.Detached)
{
dbSet.Attach(entityToDelete);
}
dbSet.Remove(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
}
然后您可以实例化并为每个表使用它:
private GenericRepository<Department> departmentRepository;
private GenericRepository<Employee> employeeRepository;
阅读更多关于通用存储库的信息。
Repo不能处理作业和消息
存储库的主要职责是通用操作(CRUD)的包装器,或者可能是一些与表有关的工作,例如count, any, some, all。
如果你想创建一个微服务架构,检查GitHub中的通用库并创建你自己的库并将通用库移动到这里是很有用的。应该是YourName.Microservice.Core
之类的。
之后,通过nuget-extension连接到Microservice.Core
。
将来,你需要扩展它们,以避免大量微服务中的代码重复。