C# 在使用DDD体系结构时,是否允许在应用程序层中使用JsonProperty属性?

C# 在使用DDD体系结构时,是否允许在应用程序层中使用JsonProperty属性?,c#,asp.net-web-api,domain-driven-design,clean-architecture,C#,Asp.net Web Api,Domain Driven Design,Clean Architecture,我在Pluralsight上学习了几门关于清洁体系结构和领域驱动设计的课程。在我等待埃里克·埃文(Eric Evan)关于DDD的书到达时,我遇到了以下情况和问题: 我正在建立一个新项目。我添加了以下项目: MyProject.Application MyProject.Common MyProject.Domain 我的项目.基础设施 我的计划,坚持 MyProject.WebApi 业务需求是让WebApi返回具有以下属性的模型: 不符合我的命名约定 它们很难看 此模型位于MyPro

我在Pluralsight上学习了几门关于清洁体系结构和领域驱动设计的课程。在我等待埃里克·埃文(Eric Evan)关于DDD的书到达时,我遇到了以下情况和问题:

我正在建立一个新项目。我添加了以下项目:

  • MyProject.Application
  • MyProject.Common
  • MyProject.Domain
  • 我的项目.基础设施
  • 我的计划,坚持
  • MyProject.WebApi
业务需求是让WebApi返回具有以下属性的模型:

  • 不符合我的命名约定
  • 它们很难看
此模型位于MyProject.Application项目中。例如:

namespace MyProject.Application
{
    public class MyModel
    {
        public string _communityname { set; get; }
        public List<string> photolist { set; get; }
        public string postedby { set; get; }
    }
}
名称空间MyProject.Application
{
公共类MyModel
{
公共字符串_communityname{set;get;}
公共列表照片列表{set;get;}
公共字符串postedby{set;get;}
}
}
通常我会将JSONProperty attibute应用于此类模型,以保持其美观:

namespace MyProject.Application
{
    public class MyModel
    {
        [JsonProperty("_communityname")]
        public string CommunityName { set; get; }

        [JsonProperty("photolist")]
        public List<string> PhotoUrls { set; get; }

        [JsonProperty("postedby")]
        public string PostedBy { set; get; }
    }
}
名称空间MyProject.Application
{
公共类MyModel
{
[JsonProperty(“\u communityname”)]
公共字符串CommunityName{set;get;}
[JsonProperty(“照片列表”)]
公共列表地址{set;get;}
[JsonProperty(“postedby”)]
公共字符串PostedBy{set;get;}
}
}
但是,我想起来了。。。并对自己说:应用层不应该关心“事物”是如何呈现的。这是表示层的任务,在本例中是WebApi

这是正确的吗?应用层应该返回一个正常的模型,并让WebApi将其转换为业务所需的任何(丑陋的)表示形式


非常感谢。

我不确定MyProject.Application到底做了什么?但我猜它不是您的REST端点,因为您有MyProject.WebApi

我将它转移到WebApi项目,因为它只涉及向用户显示特定的数据格式。我将向WebApi项目添加一个Models或ViewModels文件夹,并保留通过REST端点公开的所有对象。并在控制器操作或WebApi项目中的服务中执行从域模型到“视图模型”的转换。关键之一是不要将域模型暴露给外部世界

还可以查看Eric Evans的这段视频,了解他从最初的DDD书籍出版以来学到了什么


这个问题可能比StackOverflow更适合您。

如果您的web api是应用程序的唯一入口点,那么我认为在该项目中使用DTO不会有什么坏处。通常,当您创建“应用程序服务”时,这些服务不一定只被api使用,在这种情况下,这会让您重新思考整个问题

归根结底,您的读取模型(DTO)只不过是您希望从“应用程序服务”返回的数据的投影。客户端可以是web api,也可以是需要使用该服务的任何其他进程


这有意义吗?

我不能肯定地说这是正确的方法,但是,我可能会有一个一次性的WebApi模型,我会映射到它,这样我可以用我想要的任何属性覆盖它,并且不会影响我的应用程序的模型。是的。我也在考虑这个选择。只有一个,也许两个端点需要这种“调整”。我在看弗兰的答案,我会想出一个答案plan@Tweek我总是在WebApi/MVC项目中使用单独的视图模型,因为它将我的内部域逻辑与UI/REST的逻辑分离。我想它是个清洁工。看,我同意。这使得它更干净。查询(CQRS)将返回一个模型列表,这些模型是根据用例设计和实现的。WebApi项目将使结果符合所需的形状。当端点需要另一个契约时,我只需更改API,而不是应用层中的用例。>应用层是否应返回正常模型,并让WebApi将其转换为业务所需的任何(丑陋的)表示形式-是的。这是正确的做法。感谢您的快速回复,并将我的地址指向softwareengineering.stackexchange.com。我当然要看Evan的视频,我是多年来经典的3层(数据库驱动)应用程序设计的一员。我强迫自己采用这种DDD/清洁设计。从目前为止我得到的情况来看,应用程序层将是将用例作为可执行代码实现的层。它将被构造为高级应用程序逻辑。它知道域层(依赖性),但不知道表示层、持久性层或基础结构层。这是来自马修·伦兹的课程。谢谢你的反馈。我刚开始这个新项目。事实上,就目前而言,API是唯一呈现数据的“入口点”或“前端”。但我不确定将来是否会有更多的选择。如果是这样,它是否适合这个特定的有界上下文,或者它是否需要自己的有界上下文。请记住,您的DTO(或投影的POCO)不是域的一部分。它们实际上与域操作完全分离,因为它们所做的只是以吸引客户/消费者的方式提供数据。通常我有一个单独的项目,它有一个非常轻量级的“数据读取器”(实际上可以使用ADO.NET),直接从数据库中读取数据并将其投影到我的客户/消费者。在SQL中,您实际上可以创建视图并直接或存储过程提取这些视图。由你决定。若客户机需要来自4个不同AR的一个DTO中的数据,您只需将其投影到视图中并将其发送给客户机即可。