Automapper 引用应该在多层应用程序中放在哪里

Where should Automapper references go in multi-tiered application

我有一个网络解决方案,它包括网络 UI、网络 api 层、服务对象和封装存储库(有时使用工作单元模式)和 Entity Framework 实体。我的 Web 服务正在返回 JSON,我在 UI 控制器中反序列化,如下所示:

var response = await httpClient.GetAsync(endpoint);

var result = JsonConvert.DeserializeObject<anyTypeHere>(await response.EnsureSuccessStatusCode().Content.ReadAsStringAsync());

我的网络 api 层调用各种“服务”(全部表示为它们自己的图书馆项目 - 即:Accounting Service、EnrollmentService、CalendarService)。每个服务对象中都有通过存储库访问数据实体的代码:

// returns entity object
var customer = UnitOfWork.PatientRepository.GetCustomerById();

我想使用像 AutoMapper 这样的工具将实体对象映射到 dto/domain 对象,从而将 dto 对象返回给 UI 调用者。

我的问题是:

  1. 我应该在哪里添加Automapper参考和映射代码? (即:WebApi、服务项目、存储库层等...)

  2. 我是否应该创建一个包含 DTO 对象的单独库并在我的 UI 客户端以及 api 和服务层中引用它?

为您的 DTO 创建 class 库项目,例如 YourProject.Dtos,并将您的所有 dto 转移到该项目。然后在另一个项目(YourProject.Mapping)中创建接口:

 public interface IMapperProfile
{
}

使用此接口映射签名,如:

  public class AddressMapping : Profile, IMapperProfile
{
    public AddressMapping()
    {
        CreateMap<AddressDto, Address>(MemberList.None).ReverseMap();
    }
}

AddressRepositories 方法必须是这样的:

 public async Task<IEnumerable<AddressDto>> GetAllAsync( CancellationToken cancellationToken = default)
    {
        var result = await _entity.AsNoTracking().ToListSync();
        return _mapper.Map<IEnumerable<AddressDto>>(result);
    }

现在您可以在 api 或 ui 启动程序中注册 Automapper class :

services.AddAutoMapper(typeof(IMapperProfile));