servicestack,separation-of-concerns,Architecture,servicestack,Separation Of Concerns" /> servicestack,separation-of-concerns,Architecture,servicestack,Separation Of Concerns" />

Architecture Servicestack-体系结构和;一切都重用POCOs

Architecture Servicestack-体系结构和;一切都重用POCOs,architecture,servicestack,separation-of-concerns,Architecture,servicestack,Separation Of Concerns,我指的是POCO的注册使用: 由于ServiceStack提倡干净、可重复使用的代码,所以它一直鼓励在几乎所有事情上使用代码优先POCO。 即可以使用相同的POCO: 在请求和响应DTO中(在客户端和服务器上) 在JSON、JSV和CSV文本序列化程序中 作为OrmLite、db4o和NHibernate中的数据模型 作为存储在Redis中的实体 作为存储在缓存和会话中的blob 已在MQ的服务中删除并执行” 我喜欢servicestack&用它编写web服务是多么容易。我试图了解如何最好地设置

我指的是POCO的注册使用:

由于ServiceStack提倡干净、可重复使用的代码,所以它一直鼓励在几乎所有事情上使用代码优先POCO。

即可以使用相同的POCO:
在请求和响应DTO中(在客户端和服务器上)
在JSON、JSV和CSV文本序列化程序中
作为OrmLite、db4o和NHibernate中的数据模型
作为存储在Redis中的实体
作为存储在缓存和会话中的blob
已在MQ的服务中删除并执行”

我喜欢servicestack&用它编写web服务是多么容易。我试图了解如何最好地设置我的项目&而不是遇到任何问题

具体地说,我正在与返回一个响应对象的体系结构想法进行斗争,该对象也是一个数据模型(如SS所建议的)。分离关注点的想法在我心中根深蒂固。如果你对所有事情都使用相同的POCO,将来不会有问题。这不是“更安全”吗“例如返回例如查看对象吗?

软件最大的敌人 首先我想重复一下 是软件开发的最大敌人,同时也是满足项目需求的最大敌人 (即从我们的软件中获得价值),管理复杂性并保持最小和低摩擦, 随着我们不断地用新技术增强我们的软件,可进化的代码库应该是我们最关心的问题 新特性和要求。我们为提高软件质量而添加的任何指导方针、规则或过程都应该 直接专注于管理其基本复杂性。我们能做的最好的事情之一就是降低复杂性 是为了减少代码库的大小,即干燥可重复的代码并消除任何不必要的抽象, 间接性、概念、类型和摩擦对软件的功能不是绝对必要的

从这个角度来看,这是最好的原则之一 通过关注交付价值所必需的内容,确保代码库简单而精简

避免一刀切的规则 我避免了“毯子规则”,我认为这是软件不必要的复杂性的主要原因之一。 在这里,它经常被随意和不经考虑地应用,在没有正当理由的情况下感染代码库。 每次你强加一个人为的限制,你就在创造摩擦和惯性,在它的范围内发展 为了满足它,这就是为什么你执行的任何规则都应该经过深思熟虑和仔细应用的原因 并且仅限于它增加价值的地方

警惕无效的规则和模式 在许多情况下,甚至软件设计模式也是如此 哪里 在一种语言中有用的东西是不必要的 用更具表现力和强大的语言更优雅地解决问题。同样地,“规则”是什么 一个领域的警示指南可能不适用于其他领域。因此,什么比什么更重要 “规则”本身就是它实际提供的价值以及它试图防止的具体副作用。 一旦我们了解了它的真正价值,我们就可以进行优化,从中获得最大价值,并与YAGNI一起, 知道何时有选择地应用它

简单的POCO生活 正如您所注意到的,ServiceStack通过能够重用相同的组件实现了许多简单性和重用性 POCOs在任何地方都可以不加区别地与不同的库和组件进行接口和自由通信。 这可以实现模型的最大价值和重用,并减少不同域之间映射的摩擦 这通常需要具有特定用途的类型,每个类型都有其独特的配置,限制了其应用 适用性和潜在的重复使用

重ORM模型是差的DTO 不重用数据模型,因为DTO适用于鼓励具有周期性依赖关系的数据模型的重ORM 以及具有紧密耦合和嵌入式逻辑的代理对象,可触发意外的N+1数据访问,使 这些模型不适合用作DTO,为什么您应该总是将它们复制到特定用途中 您的服务可以返回的DTO,因此它们可以序列化而不会出现问题

清洁POCOs 存储在数据库中的复杂数据模型 或 不受任何这些问题的影响,并且能够使用 清洁、断开连接的POCO。它们是松散耦合的,只有POCO的“形状”是重要的,即。 移动项目和更改名称空间不会影响序列化,也不会影响序列化在RDBMS表中的存储方式, Redis数据结构、缓存提供程序等。 您也没有耦合到特定的类型,您可以使用不同的类型在OrmLite中插入数据,而不是您需要的类型 用于从中读取,也不需要是“精确的形状”,因为OrmLite只能使用 基础表中可用字段的子集。表、视图和视图之间也没有区别 存储过程中,OrmLite将很高兴地将任何结果集映射到指定POCO上的任何匹配字段, 忽视他人

实际上,这意味着ServiceStack中的POCO具有极强的弹性和互操作性,因此您可以 在OrmLite中重复使用相同的DTO,反之亦然,不会出现问题。如果DTO和数据模型仅略有偏差, 您可以使用或存储在OrmLite中 以下属性:

public class Poco
{
    [Ignore]
    public int IgnoreInOrmLite { get; set; }

    [IgnoreDataMember]
    public int IgnoreInSerialization { get; set; }
}
否则,当您需要将它们分开时,例如,添加到RDBMS表中的字段比您想要的多 返回时,DTO包含从其他来源填充的其他字段,或者您只需要您的服务 以不同的方式投射它们。此时(YAGNI),您可以复制DTO并将其添加到您的服务中 实现,这样它们就可以独立增长,不受不同关注点的阻碍。 然后,您可以使用
,例如:

RDBMS表通常是定义为名词的实体,即服务返回的内容:

public class SearchProductsResponse
{
    public List<Product> Results { get; set; }        
    public ResponseStatus ResponseStatus { get; set; }
}
公共类搜索产品响应
{
公共列表结果{get;set;}
公众反应
public class SearchProducts : IReturn<SearchProductsResponse> 
{
    public string Category { get; set; }
    public decimal? PriceGreaterThan { get; set; }
}
public class SearchProductsResponse
{
    public List<Product> Results { get; set; }        
    public ResponseStatus ResponseStatus { get; set; }
}