servicestack,C#,Asp.net,Web Services,Architecture,servicestack" /> servicestack,C#,Asp.net,Web Services,Architecture,servicestack" />

C# 大型ServiceStack/.NET项目的合适项目体系结构是什么?

C# 大型ServiceStack/.NET项目的合适项目体系结构是什么?,c#,asp.net,web-services,architecture,servicestack,C#,Asp.net,Web Services,Architecture,servicestack,我们正处于为公司建立内部企业API层的设计阶段。我们希望实现一个API,既能服务于我们的内部应用程序,也能服务于我们的外部客户。我们的环境是MS heavy、IIS、ASP.NET MVC应用程序等 我们有一个现有的服务层设计得不好,所以这次我们正努力做到这一点 表示主文档中不再存在的较大ServiceStack项目的项目细分。主要包括一个单独的“逻辑”项目。我们正试图将其与Martin Fowler在企业应用程序体系结构模式中概述的许多内容结合起来 以下是我们正在考虑的: ○ Serv

我们正处于为公司建立内部企业API层的设计阶段。我们希望实现一个API,既能服务于我们的内部应用程序,也能服务于我们的外部客户。我们的环境是MS heavy、IIS、ASP.NET MVC应用程序等

我们有一个现有的服务层设计得不好,所以这次我们正努力做到这一点

表示主文档中不再存在的较大ServiceStack项目的项目细分。主要包括一个单独的“逻辑”项目。我们正试图将其与Martin Fowler在企业应用程序体系结构模式中概述的许多内容结合起来

以下是我们正在考虑的:

    ○ Service.Host (single)
        § Dumb Host
        § Assigned multiple Service Interfaces on startup (subsystems)

    ○ Service.Interfaces (many projects)
        § Subsystems of Business (e.g. Ordering, Customers, etc)
        § Data Access Layer with Repository pattern
        § Service Layer endpoints
            □ Application endpoints (returns data/dtos for views/screens)
            □ Vendor Endpoints (Feeds, hierarchies, etc; authentication/authorization)

    ○ Service.Models (single)
        § DTOs for all systems (namespaced appropriately?)
        § Shared and distributed to vendors/client apps
        § No dependencies

    ○ Service.Logic
        § Rich Domain Layer
            □ Objects that model our business
            □ Rules/algorithms for business logic

    ○ Service.Tests
Fowler和其他人建议DTO和业务逻辑应该相互独立,并在它们之间转换程序集/工厂类

第一个问题:汇编程序住在哪里?在服务接口项目中?在他们自己的项目中?每次转换都需要它们吗

其次:客户机是否需要转换回域对象,或者客户机只是使用DTO填充屏幕并将数据发送回服务?我们只希望客户端依赖于服务模型类,对吗

第三:我们如何设计DTO?以前,它们是表示一种资源的POCO(尝试使用restful、OrderDTO、CustomerTo等)。实际上,所需的数据是复杂的。我们最初认为客户可以单独请求他们需要的任何东西,然后将它们重新组合在一起。Fowler指出,我们希望最小化对服务的请求,并使用几乎是业务对象聚合的DTO,以尝试一次将其全部发送下来。因此,如果我有一个订单,并且希望客户与之关联,我是否应该发送一个包含所有填充内容的CustomerOrderTo?或者我是否发送一个订单对象,并强制客户机对订单发出另一个请求

第四:在哪里使用实际的C#接口合适?我们是否为每个存储库提供了一个可切换和可测试的存储库?每个服务接口一个

第五:除了在每一层绘制地图之外,别无选择吗?i、 e.使用ORM将SQL转换为数据层。使用AutoMapper或ServiceStack mapper从数据层到域层。域层到DTO。DTO到ViewModel。ViewModel到Javascript模型(例如Knockout)似乎有很多重复和样板。有更好的办法吗


我不想让这一点变得主观——但这里的一些细节几乎没有指导原则——我们的假设是,ServiceStack框架中缺少一些最佳实践或意图来解释这些事情。提前感谢您回答这些问题。

这包含了太多的广泛问题,无法回答任何深度的问题,问题不应该有多个涉及不同主题的脱节问题,你应该把这个问题分成多个重点问题,这样就可以清楚地知道这个问题是什么以及它期望的答案

我首先推荐阅读ServiceStack文档中的部分,该部分介绍如何使用ServiceStack设计API

请特别注意,因为它涵盖了创建服务时应该考虑的很多内容。例如,如果您使用,您可以重复使用DTO、ViewModels、缓存提供程序等中的数据模型。但如果需要,您可以使用ServiceStack在DTO模型之间轻松映射。无论哪种方法,都要尽量避免在每一层中都有多个人工层和不同的模型,这是不必要摩擦的一个巨大来源

它还强调,您应该尽可能减少任何不必要的层/图案等,因为每次添加层时,您都在添加人工摩擦,因此确保添加的每一层都有其用途,并且您可以看到它们各自增加的价值。例如,我建议不要有多个细粒度存储库,我通常会有一个存储库来覆盖相关功能的整个子系统,并且强烈建议不要基于与您的域无关的任意规则(例如,每个表)机械地创建细粒度存储库

如果您有多个实现或者想要编写模拟它们的测试,那么您只需要C#接口

ServiceStack鼓励您这样做,而不是设计特定于客户端的细粒度RPC服务,尝试设计通用的、可重用的、批处理的服务,最大限度地减少强制客户端执行多个依赖的I/O服务,并在单个服务响应中发送客户端需要的数据(当它与该请求相关联时)

ServiceStack已经在大多数中实现,因此我建议使用最合适的ServiceStackVS模板启动一个新项目。例如,{Project}.ServiceInterface保存服务实现,而{Project}.ServiceModel保存无impl项目中的DTO,因此可以重用这些类型

通过在一个单独的ServiceModel项目中维护DTO,它消除了客户机之间的摩擦,客户机可以将类型化DTO与任何API一起重用,从而实现端到端类型化API


客户端不必共享您的ServiceModel项目,还可以使用ServiceStack的功能导入远程服务的所有类型,该远程服务可以与C#客户端一起使用以启用类型化API。要了解此功能的工作方式和原因,请使用live checkout,您可以从浏览器调用任何远程ServiceStack服务。

此功能包含太多无法深入回答的广泛问题,问题不应包含多个涵盖不同主题的不连贯问题,你应该把这个问题分成多个重点问题,这样就可以清楚地知道这个问题是什么以及它期望的答案

我首先推荐阅读ServiceStack文档中的部分,该部分介绍如何使用Servi设计API