应该使用哪个层的值对象?



以下示例显示了一个查询以获取雇用详细信息。它有一个int参数Id。并且有一个DTO类EmployeeDto,它还有一个Id,类型为string

https://github.com/JasonGT/NorthwindTraders/blob/master/Src/Application/Employees/Queries/GetEmployeeDetail/GetEmployeeDetailQuery.cs

我需要创建一个值对象类EmployeeId其中包含员工 ID 的一些业务逻辑。实体类EmployeeId将更改为EmployeeId类型,而不是string

  1. DTO/VM类的Id类型EmployeeDtostring吗?自动映射器用于将string映射到EmployeeId?因此,UI 将更容易重新输入列表。
  2. 查询的属性Id的类型GetEmployeeDetailQuery应为主类型字符串/整数?在哪里检查参数是否为有效的员工 ID(值对象EmployeeId具有验证逻辑(?

法典:

public class GetEmployeeDetailQuery : IRequest<EmployeeDetailVm>
{
public int Id { get; set; } // Stay as primary type string/int?
// public EmployeeId Id { get; set; } // or EmployeeId?
public class GetEmployeeDetailQueryHandler : IRequestHandler<GetEmployeeDetailQuery, EmployeeDetailVm>
{
private readonly INorthwindDbContext _context;
private readonly IMapper _mapper;
public GetEmployeeDetailQueryHandler(INorthwindDbContext context, IMapper mapper)
{
_context = context;
_mapper = mapper;
}
public async Task<EmployeeDetailVm> Handle(GetEmployeeDetailQuery request, CancellationToken cancellationToken)
{
var vm = await _context.Employees
.Where(e => e.EmployeeId == request.Id)
.ProjectTo<EmployeeDetailVm>(_mapper.ConfigurationProvider) // to be mapped to entity here
.SingleOrDefaultAsync(cancellationToken);
return vm;
}
}
}

https://github.com/JasonGT/NorthwindTraders/blob/master/Src/Application/Employees/Queries/GetEmployeeDetail/GetEmployeeDetailQuery.cs

namespace Northwind.Application.Employees.Queries.GetEmployeeDetail
{
public class EmployeeDetailVm : IMapFrom<Employee>
{
public int Id { get; set; } // int/string
// public EmployeeId Id { get; set; } // or EmployeeId?
public string Title { get; set; }

值对象是一个域概念,因此,应在使用其他域概念时使用。

如果数据通过网络传输,我倾向于使用原语,或者在必要时使用其他数据传输对象。 这些 DTO 从来没有任何行为,当我想要添加一些方法时,我倾向于使用扩展方法。

值对象,就像聚合/实体的情况一样,很可能会被封装到可能不适合序列化的程度。

相关内容

  • 没有找到相关文章

最新更新