以下示例显示了一个查询以获取雇用详细信息。它有一个int
参数Id
。并且有一个DTO类EmployeeDto
,它还有一个Id
,类型为string
。
https://github.com/JasonGT/NorthwindTraders/blob/master/Src/Application/Employees/Queries/GetEmployeeDetail/GetEmployeeDetailQuery.cs
我需要创建一个值对象类EmployeeId
其中包含员工 ID 的一些业务逻辑。实体类Employee
的Id
将更改为EmployeeId
类型,而不是string
。
- DTO/VM类的
Id
类型EmployeeDto
string
吗?自动映射器用于将string
映射到EmployeeId
?因此,UI 将更容易重新输入列表。 - 查询的属性
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 从来没有任何行为,当我想要添加一些方法时,我倾向于使用扩展方法。
值对象,就像聚合/实体的情况一样,很可能会被封装到可能不适合序列化的程度。