C# 在干净的体系结构中实现业务逻辑的混乱
在过去的两周里,我一直在尝试在一个新的应用程序中理解并实现干净的体系结构。我读过罗伯特·马丁(Robert Martin)关于这一主题的博客文章,以及许多其他文章——每一篇都有自己的观点,这让我有点困惑 请记住,我还没有掌握更深入的DDD原则,如有界上下文、值对象等,所以我试图让这个设计(以及我最初的理解)尽可能简单。我尝试使用Repository/UnitOfWork模式,下面是我的Visual Studio解决方案目前的样子(为了简洁起见,我对其进行了一些简化): 我曾想过在我的C# 在干净的体系结构中实现业务逻辑的混乱,c#,asp.net-mvc,clean-architecture,C#,Asp.net Mvc,Clean Architecture,在过去的两周里,我一直在尝试在一个新的应用程序中理解并实现干净的体系结构。我读过罗伯特·马丁(Robert Martin)关于这一主题的博客文章,以及许多其他文章——每一篇都有自己的观点,这让我有点困惑 请记住,我还没有掌握更深入的DDD原则,如有界上下文、值对象等,所以我试图让这个设计(以及我最初的理解)尽可能简单。我尝试使用Repository/UnitOfWork模式,下面是我的Visual Studio解决方案目前的样子(为了简洁起见,我对其进行了一些简化): 我曾想过在我的Core项目
Core
项目中实现usecaseholders
:
public class CourseListHandler
{
private readonly IUnitOfWork _uow;
public CourseListHandler(IUnitOfWork uow)
{
_uow = uow;
}
public List<CourseNameResponseModel> Execute()
{
using (_uow)
{
return _uow.Courses
.GetAll()
.Select(s => new CourseNameResponseModel() {
Id = s.Id,
Name = s.Name,
Level = s.Level
})
.OrderBy(o => o.Name)
.ToList();
}
}
}
公共类CourseListHandler
{
私人只读IUnitOfWork;
公共课程讲师(IUnitOfWork uow)
{
_uow=uow;
}
公共列表执行()
{
使用(_uow)
{
返回u uow.Courses
.GetAll()
.Select(s=>newcourseNameResponseModel(){
Id=s.Id,
Name=s.Name,
标高=s.标高
})
.OrderBy(o=>o.Name)
.ToList();
}
}
}
然后将其注入到相关的控制器类中,并在其中一个操作方法中调用。我选择使用UnitOfWork,因为我觉得如果需要的话(将来也会这样),它将允许我在一个事务中处理多个存储库对象
问题:
CourseListHandler
只处理从存储机制获取课程简化列表的一个用例。考虑到这是针对API的,控制器(端点)中的每个操作都可能有许多用例处理程序,并且需要注入控制器的UseCaseHandler类的数量将变得非常大。我知道坚实的原则告诉我们,在这种情况下,一个班级应该只负责做一件事,但这不被认为是“过度工程”吗这不是一个.NET核心解决方案-它使用的是.NET framework 4.7,我计划在DI/IoC中使用Unity。哇,太多了,让我试着按顺序回答这些问题
A.抽象到一个服务可能是正确的,这取决于具体情况。我经常发现,我可以将我的许多逻辑放在域模型本身中。在这些情况下,域模型知道它们可以保存一些东西,就像学生可以向自身添加类一样,但实现这一点并不是域模型所关心的问题,它只是在一个事件中广播说John Smith添加了代数级别3。您的存储库应该设置为能够正确截取和保存该事件
public interface IUnitOfWork : IDisposable
{
ICourseRepository Courses { get; }
IStudentRepository Students { get; }
int Complete();
}
public class CourseListHandler
{
private readonly IUnitOfWork _uow;
public CourseListHandler(IUnitOfWork uow)
{
_uow = uow;
}
public List<CourseNameResponseModel> Execute()
{
using (_uow)
{
return _uow.Courses
.GetAll()
.Select(s => new CourseNameResponseModel() {
Id = s.Id,
Name = s.Name,
Level = s.Level
})
.OrderBy(o => o.Name)
.ToList();
}
}
}