gpt4 book ai didi

asp.net-mvc - 洋葱架构——服务层职责

转载 作者:行者123 更新时间:2023-12-04 21:58:15 34 4
gpt4 key购买 nike

我正在学习 Jeffrey Palermo 的 Onion Architecture 已经两个多星期了。我按照 this tutorial 创建了一个测试项目.学习的时候遇到了this关于SO的问题。根据接受的答案,一个人nwang建议 GetProductsByCategoryId 之类的方法不应在存储库中,另一方面 Dennis Traub表明这是存储库的责任。我正在做的是:

我在 Domain.Interface 中有一个通用存储库其中我有一个方法Find :

public interface IRepository<TEntity> where TEntity : class
{
IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> filter = null);
.......
.......
.......
}

然后我创建了一个 BaseRepositoryInfrastucture.Data :
public class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class
{
internal readonly DbSet<TEntity> dbSet;
public virtual IEnumerable<TEntity> Find(
Expression<Func<TEntity, bool>> filter = null)
{
IQueryable<TEntity> query = dbSet;

if (filter != null)
{
query = query.Where(filter);
}
return query.ToList();
}
}

我有一个 混凝土仓库 Infrastructure.Data
public class ProductRepository : RepositoryBase<Product>, IProductRepository
{
public ProductRepository(MyDBContext context)
: base(context)
{

}
}

现在我在服务层中所做的是将存储库注入(inject)服务并调用 Repository.Find对于像 GetProductsByCategoryId 这样的方法.像 :
public class ProductService : IProductService
{
private readonly IUnitOfWork _unitOfWork;
private readonly IProductRepository _productRepository;

public ProductService(IUnitOfWork unitOfWork, IProductRepository productRepository)
{
_unitOfWork = unitOfWork;
_productRepository = productRepository;
}

public IList<Product> GetProductsByCategoryId(int CategoryId)
{
// At the moment, My code is like this:
return _productRepository.Find(e => e.CategoryId == CategoryId).ToList();

// My confusion is here. Am I doing it right or I need to take this code to
// ProductRepository and call _productRepositoy.GetProductsByCategoryId(CategoryId) here instead.
// If I do this, then Service Layer will become more of a wrapper around repository. Isn't it?
// My question is : What exactly will be the responsibility of the Service Layer in Onion Architecture?
}
}

最佳答案

您设计应用程序的方式还可以……但前提是您的服务将处理其他事情,而不仅仅是包装存储库方法!

始终牢记 YAGNI principle说的是:

Always implement things when you actually need them, never when you just foresee that you need them



假设您有一个用户故事,它说每当在您的数据库中找不到产品描述时,您应该从其他地方检索它(调用外部服务或其他东西)。那么很明显你的 ProductService 必须有一个
private readonly IProductRepository _productRepository;

但也是一个
private readonly IProductDescriptionService _productDescriptionService;

在这种情况下,在您的存储库之上添加一个服务层真的很有意义。

关于asp.net-mvc - 洋葱架构——服务层职责,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17442366/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com