【问题标题】:Best way to build/map a model from a request and response on Web API 2从 Web API 2 上的请求和响应构建/映射模型的最佳方式
【发布时间】:2017-05-09 18:34:23
【问题描述】:

在我的 WebApi 2 应用程序中,我有这个基本结构:

请求/响应模型 -> 领域(业务)模型 -> EF 数据模型

WebApi 控制器 -> 服务层 -> 模型层 -> EF 存储库层

MyModel.cs 文件

public class MyModel
{
       public string Property1 { get; set; }
       public string Property2 { get; set; }

       public MyModel(){}

       public MyModel(RedirectRequest request,RedirectResponse response)
       {
           Property1 = request.Property1;
           Property2 = request.Property2;
           /*... (more logic here)*/
       }
}

Service.cs 文件(注入并在控制器中使用)

public void SaveMyModel(RedirectRequest request,RedirectResponse response)
        {
            var myModel = new Domain.MyModel(request,response);
            /*...*/ 
            var myDataModel = Mapper.Map<Data.Models.MyModel>(myModel);           
            _repository.AddOrUpdate(myDataModel);
        }

public  async Task<RedirectResponse> RedirectAndSaveRequest(RedirectRequest request)
        {
            var response = await Redirect(request);
            SaveMyModel(redirect,response);

            return response;
        }

我正在讨论使用请求和响应模型构建/映射我的域/业务模型的正确方法,然后才能持久化。

MyModel 实例需要根据一些业务/逻辑规则来构建请求和响应模型,正如我所展示的。

我觉得将这些规则排除在域模型本身之外以防止它变得贫乏或构建额外的类或层(业务或映射层或类?)只是为了执行此基于逻辑的映射,这是不对的,因为它似乎矫枉过正。一位朋友告诉我它应该由 MVC 驱动(贫血/虚拟/POCO 模型在类似 DTO 的模式上表现得像 DTO) 我不完全同意。

这种方法的正确方法是什么?非常感谢大家的洞察力。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-web-api domain-driven-design


    【解决方案1】:

    API 层将引用包含丰富领域模型的服务层。如果您为您的 API 分发客户端包装器/SDK,您可以创建一个仅包含数据合约(贫血模型、DTO、POCO)的单独项目。这样,您就可以为您的数据合约创建一个通用项目,供消费项目/客户使用。如果不是,您的模型可以与您的 API 项目存在于同一个项目中。

    在您的 API 层/项目中,使用 Automapper 配置文件创建映射器,它所做的只是将域模型映射到您的 API 模型/数据合约。

    【讨论】:

    • 嗨@alltej!,想问你一些额外的问题:我可以将映射类放在服务层内吗?,将它放在 WebAPI 或服务项目上的标准是什么?,从请求和响应中构建模型的想法是错误的?在哪些情况下,我可以将逻辑放在模型中并且不将其派生到额外的层或组件? Thx 吨
    • @CoderRoller 我不建议将映射类放在服务层中,因为它不是服务层的责任。服务层应该输出领域模型而不是 API 的数据契约。不过,这对于小型项目来说可能有点过头了。因此,在 API 层中,您可以选择创建贫血的 DTO/模型并将其映射到您的域模型,或者只返回域模型本身。但作为领域/服务层,应该不是我的责任。
    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多