【问题标题】:Where should Automapper references go in multi-tiered applicationAutomapper 引用在多层应用程序中应该放在哪里
【发布时间】:2020-07-03 23:06:03
【问题描述】:

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

var response = await httpClient.GetAsync(endpoint);

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

我的 web 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 和服务层中引用它?

【问题讨论】:

    标签: asp.net-core asp.net-web-api asp.net-core-mvc automapper automapper-collections-ef-core


    【解决方案1】:

    为您的 DTO 创建类库项目,例如 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:

    services.AddAutoMapper(typeof(IMapperProfile));
    

    【讨论】:

    • 是否还需要将api webservice返回的dto对象映射到ui模型对象?或者我的域(模型)对象是否应该与您在回答中提到的 dto 相同?
    • 您可以使用相同的域模型 dto,也可以拥有您的 ui 域模型并将返回的 api dto 反序列化为 ui dto,而无需自动映射器映射配置
    • 与我已经在做的非常一致。非常感激。我会接受这是一个有效的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2011-12-07
    • 2016-09-20
    • 2011-03-18
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多