c#自定义控件资源释放问题_定义资源

c#自定义控件资源释放问题

在Fielding的论文中 ,资源描述为:

“可以命名的任何信息”……“文档或图像,临时服务(例如,“洛杉矶今天的天气”),其他资源的集合,非虚拟对象(例如,人) 等等。 换句话说,任何可能成为作者超文本 引用 目标的概念都 必须符合资源的定义。 资源是 到一组实体 的概念性映射 ,而不是在任何特定 时间 点对应于该映射的实体 。”

定义资源既是科学也是艺术 。 它需要领域知识和API体系结构技能。 下面详细介绍的以下几点用作清单,可以帮助您确定资源。

资源必须包含业务描述

  • 商业描述应为简单散文中的3-4个句子,以说明资源是什么。
  • 对您的系统有一定了解的开发人员应该能够理解该描述
  • 对资源的任何警告均应明确

资源应单独使用

这类似于定义微服务边界的准则,在这种情况下,应将微服务视为自身有用。 同样,资源应单独使用。

例如,代替:

 /street-address/{id}  RESPONSE  { "street1" : "String" , "street2" : "String"  } 

 /address-extra/{id}  RESPONSE  { "city" : "String" , "country" : "String"  } 

它应该是:

 /address/{id}  RESPONSE  { "street1" : "String" , "street2" : "String" , "city" : "String" , "country" : "String"  } 

如果资源本身没有用,并且总是需要后续请求,则这意味着代码将不可避免地变得更加复杂,并且第二个请求将对性能产生影响

使用适当的名词

首选使用简单名词而非复合名词。 例如,
地址优于AddressInfoAddressDetail 。 这是一条总规则,总会有例外

如果使用多个资源表示同一数据的不同视图,例如: AddressAddressDetail ,则使用简单名词,例如
地址第一。 然后,如果第二种表示更详细地使用
ResourceNameDetail,或者如果不够详细,请使用ResourceNameSummary 。 例如,假设需要引入一个地址类型资源:

  1. 地址先介绍
  2. 如果需要更详细的地址后续视图,则新资源应称为AddressDetail
  3. 如果需要的后继地址视图不够详细,则新资源应称为AddressSummary

如果仅在READ中使用它,它是否需要成为资源?

如果仅在读取请求中使用过资源,而从未在写入创建,部分更新,完全更新,删除等 )请求中使用过资源,则是否需要将其定义为具有自己的URI的资源存在疑问。 可以将其添加到父负载中,如果担心负载变得太复杂,则父可以仅提供一个稀疏查询-客户端可以根据API请求决定要返回的内容。

资源应符合统一接口

统一接口是良好API设计的重要组成部分。 如果创建,读取,更新,删除等操作以一致的方式进行,则意味着代码更加一致,可重用且更易于维护。

这表示:

 GET /addresses/{id} 

 GET /addresses 

必须返回相同的地址数据结构来表示一个地址。

 GET /addresses/{id}  RESPONSE  { "id" : "546" , "street1" : "String" , "street2" : "String" , "city" : "String" , "country" : "String"  } 

 GET /addresses  RESPONSE  { "elements" : [ { "id" : "546" , "street1" : "String" , "street2" : "String" , "city" : "String" , "country" : "String" }, ... ]  } 

同样,对于写入有效负载,数据结构应该相同。 因此,更改street1的部分更新将是:

 POST /addresses/{id}/edit  REQUEST  { "street1" : "Walkview"  }  RESPONSE  { "id" : "546" , "street1" : "Walkview" , "street2" : "Meadowbrook" , "city" : "Dublin" , "country" : "Ireland"  } 

而不是像

 POST /addresses/{id}  REQUEST  { "newStreet1Value" : "Walkview"  } 

从资源的角度来看,数据结构必须一致。 不同的数据结构意味着不同的资源,应使用不同的名称命名并具有自己的路径。

不要暴露一切

如果您的数据库模型非常复杂,则不需要在API级别公开所有属性。 有些字段只能保留用于后台处理,而不能显示在UI上。 此类属性绝对不应包含在JSON API中。

向JSON资源添加属性时,请考虑:

  • API中应仅公开您确定客户端感兴趣的字段
  • 如果不确定,请忽略该属性。 稍后添加属性,然后删除已公开的属性的风险要低得多。

API模型不应盲目地反映数据库关系模型或OO模型

在数据库建模方法中,例如使用规范化数据或折叠继承层次结构。 在面向对象的设计中,诸如多态,继承层次结构等技术被用于促进诸如代码重用之类的事情并减少耦合。

资源建模不必遵循这些技术。 API的使用者不关心数据是全部放在一个表中还是在多个表中进行了规范化。 通常,API以易于使用的格式返回数据,并且在客户端变得有用之前不需要客户端进行太多其他映射。

使用分层数据避免重复

与诸如CSV之类的平面格式相比,分层数据的优点之一是它提供了一种避免重复的机制。 例如,考虑一个数据结构,其中包含人员列表以及他们所在的团队。在CSV中,这是:

 team, firstname, lastname  Liverpool, Mo, Salah  Liverpool, Andy, Roberston 

在JSON中,可能是:

 { "team" : "Liverpool" , "players" : [ { "firstName" : "Mo" , "lastName" : "Salah" }, { "firstName" : "Andy" , "lastName" : "Roberston" }, ... ]  } 

使用分层数据使上下文清晰

分层数据的另一个优点是它有助于提供上下文。 要了解平面数据结构,您需要了解生成数据结构的查询是什么,以了解其含义。 例如,考虑一堆包含日期范围的行。

 name, fromDate, toDate, holidays  Tony, 2018 - 01 - 01 , 2018 - 02 - 02 , true  Tony, 2018 - 02 - 03 , 2018 - 03 - 01 , false 

您可以假设当Tony休假时会有新的一行。 但是如果还有另一列怎么办

 name, fromDate, toDate, holidays, sick,  Tony, 2018 - 01 - 01 , 2018 - 02 - 02 , true , false  Tony, 2018 - 02 - 03 , 2018 - 03 - 01 , false , true 

日期范围是否对应于假期,疾病或两者兼而有之?

如果我们获得更多数据,也许会更清楚……

 name, fromDate, toDate, holidays, sick,  Tony, 2018 - 01 - 01 , 2018 - 02 - 02 , true , false  Tony, 2018 - 02 - 03 , 2018 - 03 - 01 , false , true  Tony, 2018 - 03 - 02 , 2018 - 04 - 01 , false , false 

现在看来,日期范围所对应的是一种病,这只是一个巧合,它排列了一个假期。 但是,当我们获得更多数据时,此理论将失败:

 name, fromDate, toDate, holidays, sick,  Tony, 2018 - 01 - 01 , 2018 - 02 - 02 , true , false  Tony, 2018 - 02 - 03 , 2018 - 03 - 01 , false , true  Tony, 2018 - 03 - 02 , 2018 - 04 - 01 , false , false  Tony, 2018 - 04 - 02 , 2018 - 05 - 01 , true , false 

平面数据结构的问题在于,只能使数据自我描述。 如果没有任何信息,它将变得更加复杂。 例如:

 name, fromDate, toDate, holidays, sick,  Tony, 2018 - 01 - 01 , 2018 - 02 - 02 , true , false  Tony, 2018 - 02 - 03 , 2018 - 03 - 01 , false , true  Tony, 2018 - 03 - 02 , 2018 - 04 - 01 , false , false  Tony, 2018 - 04 - 02 , 2018 - 05 - 01 , true , false  Tony, 2018 - 05 - 02 , 2018 - 06 - 01 , null , false  Tony, 2018 - 06 - 02 , 2018 - 07 - 01 , null , false  Tony, 2018 - 07 - 02 , 2018 - 07 - 08 , true , false  Tony, 2018 - 07 - 08 , 2018 - 07 - 09 , true , null 

不可避免的是,处理该数据将是错误的。 我们可以用以下分层格式表示相同的数据:

 { "name" : "tony" , "holidays" : [ { "fromDate" : "fromDate" "2018-01-01" , "toDate" : "2018-02-02" }, { "fromDate" : "fromDate" "2018-04-02" , "toDate" : "2018-05-01" }, { "fromDate" : "2018-07-02" , "toDate" : "2018-07-09" } ], "sick" : [ { "fromDate" : "2018-02-03" , "toDate" : "2018-03-01" } ]  } 

现在,数据更加自我描述。 很明显,日期范围是假期还是病假。

资源关系

资源本身只能描述自己。 资源模型描述资源之间的关系。 这将表明:

  • 资源之间的依赖关系。 存在特定资源需要哪些资源,或者当特定资源发生更改时会影响哪些资源:更新或删除。
  • 数据导航–在大域模型中,如果向模型的使用者提供导航和方向感,则更容易理解和遵循。 特别是何时进行导航(资源松散连接)与向下导航(资源牢固连接)可以区分开

资源不仅应该考虑实现HATEOAS的超媒体链接; 当资源使用超媒体链接描述它们所链接的内容时,它是表达资源模型的一种非常强大的机制。 优势包括:

  • 它将大型域模型分为多个易于管理的部分。 通常,用户只对模型的特定部分感兴趣。 当“资源”自己描述自己的关系时,这意味着将一个大型的复杂模型分解为易于消化的部分,并且用户可以更快地获取所需的信息。
  • 资源模型是自我描述的,并与代码保持同步。 一切都在同一地点。

明确父母与子女的关系

子级self通过URL层次名称间隔描述父级。 父资源具有一种或多种类型的子代,应通过提供子代的链接来阐明这一点。 例如,如果一个团队有一个玩家。 团队有效负载应对此进行明确说明。

 REQUEST  https: //api.server.com/teams/4676  RESPONSE  { "id" : "34533" , ..., "_links" : { "self" : " https://api.server.com/teams/4676 " , "players" : " https://api.server.com/teams/4676/players " }  } 

明确对等关系

这与上面的类似,只不过它用于存在于不同层次名称空间中的资源。 因此,例如,假设团队在部门1中。应该在团队的部门属性中包含一个链接。

 REQUEST  https: //api.server.com/teams/4676  RESPONSE  { "id" : "34533" , "division" : { "name" : "Division 1" , "_links" : { "self" : " https://api.server.com/divisions/1 " } }, ..., "_links" : { "self" : " https://api.server.com/teams/4676 " , "players" : " https://api.server.com/teams/4676/players " }  } 

明确链接到其他表示形式

如果将数据建模为具有多个代表数据不同表示形式的资源,则这些资源还应包括彼此的链接。

 REQUEST  https: //api.server.com/teams/4676  RESPONSE  { "id" : "34533" , "division" : { "name" : "Division 1" , "_links" : { "self" : " https://api.server.com/divisions/1 " } }, ..., "_links" : { "self" : " https://api.server.com/teams/4676 " , "players" : " https://api.server.com/teams/4676/players " , "teamDetails" : " https://api.server.com/teamDetails/4676 " }  } 

翻译自: https://www.javacodegeeks.com/2019/06/defining-resource.html

c#自定义控件资源释放问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库存入日期(java.sql.Date)数据,天数会少一天的问题

网络上给的解决办法: 这是数据库服务器时区的问题,即连接参数 serverTimezone 的问题,默认情况下 serverTimezoneUTC,改成 HongKong 或者 Asia/Shanghai 就可以了。如下所示: jdbc:mysql://localhost:3306/test?useU…

spring的bean范围_Spring Bean范围

spring的bean范围介绍: Spring核心容器实例化bean并管理其生命周期。 在定义bean时,我们可以提供其范围。 除非明确提供,否则单例是Spring容器中Bean的默认范围。 Spring提供了五种类型的bean作用域。 在本教程中,我们将探讨它们…

java.util.Date转换成java.sql.Date

// 获取当前的系统时间,以java.util.Date对象返回 Date dateUtil new Date(); // 获取当前的系统时间,以时间戳返回 long l System.currentTimeMillis();时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现…

省编码市编码区县编码_无浪费编码

省编码市编码区县编码本文介绍了如何通过减少软件堆栈中的浪费来高效解决有意义的事件处理问题。 Java通常被视为无法在低内存环境中有效运行的内存猪。 目的是证明许多人认为不可能的事情,有意义的java程序几乎可以在没有内存的情况下运行。 示例流程 在Java的单…

Java日期时间字符串和毫秒相互转换的方法

参考链接: 1.https://www.jb51.net/article/130195.htm 2.https://blog.csdn.net/yhj19920417/article/details/73799842?locationNum10&fps1

谷歌本地不支持websocket_django开发-websocket的实现

今天介绍下如何在django中使用channels实现websocket。其实还可以使用dwebsocket实现websocket,这里不做介绍。首先介绍一个概念ASGI。ASGI异步网关协议接口,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型&…

我要正式开始《一个项目征服Java中高级体系》

在互联网上经常看到很多人说35岁危机的问题、大厂裁员、互联网寒冬这些问题。我感觉比较幸运的是,在之前大环境还不是很坏时候就被裁了一次,所以我很早就开始做持续的准备,现在不好说一定能怎么样, 至少自己在持续的探索适合自己的…

cuba 平台_CUBA 7的新功能

cuba 平台三年前,我们宣布了该框架的第二个公开可用的主要版本。 CUBA 6是改变游戏规则的版本–许可从专有转为Apache 2.0。 那些日子,我们甚至无法猜测从长远来看它将把框架带到哪里。 CUBA社区开始呈指数级增长,因此我们了解了开发人员如何…

java.util.Date详解

获取当前的系统时间: Date date new Date();获取毫秒数: long time date.getTime();毫秒数转成 Date 对象: long l 23434324324343L; Date date new Date(l);比较两个 Date 对象: SimpleDateFormat sdf new SimpleDateFo…

夸克代码_关于夸克的思考

夸克代码Quarkus,新的“超音速,亚原子” Java框架目前正受到广泛关注。 对于企业Java的未来而言,此构建和运行时工具背后的思想确实比我们感兴趣。 使用Quarkus有什么好处和缺点? 摆脱动力 Quarkus认为,在容器化的世…

ntdll 异常代码0xc0000374_不要把异常当做业务逻辑,这性能可能你无法承受

一:背景1. 讲故事在项目中摸爬滚打几年,应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬_┬),比如说判断一个数字是否为整数,就想当然的用try catch包起来,再进行 int.Parse,如果抛异常就说明不是整…

java中的hashset_Java中的HashSet

java中的hashset介绍: Java中的HashSet实现Set接口,即它不允许重复。 它在内部由HashMap支持,该哈希表基于哈希原理。 我们可以在HashSet中存储一个空值。 默认容量为16,负载系数为0.75,其中: Load facto…

win32bridge.server.exe函数不正确_修电脑?不,其实我们学的是......

COMPUTER计信学子Python?JAVA?C?C?HTML?身为重师计信人逢年过节总免不了被亲戚们“盘问”一番必问清单第一名就是“专业”他们往往从字面去理解而我们计信人被误解的频率相当高“学计算机的肯定会修电脑对吧”请接着看下去吧!我们学的到底是什么?(点击查看答案…

SimpleDateFormat详解

SimpleDateFormat 中的时间标识含义: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时 在一天中 (0~23) m 分 s 秒 S 毫秒 E 星期 D 一年中的第几天 F 一月中第几个星期几 w 一年中第几个星期 W 一月中第几个星期 a 上午 / 下午 标记符 k 时 在一天中 …

java uuid_Java UUID

java uuid介绍: UUID(通用唯一标识符)表示一个128位长的唯一值 。 它也被普遍称为GUID(全球唯一标识符)。 UUID的标准表示形式由十六进制数字组成: 533a4559-e55c-18b3-8456-555563322002并具有36个字符 …

JDK 9.0.4 报错:程序包 com.sun.xml.internal.fastinfoset.stax.events 不存在/不可见

IDE:IntelliJ IDEA 构建工具:Maven JDK版本:JDK 9.0.4 在代码中使用下面的工具类: com.sun.xml.internal.fastinfoset.stax.events.Util报错如下: 或者 光标移到 Util 处,按下 Option Enter&#xff1a…

3650m5设置u盘启动_系统重装必备神器,U盘如何制作启动盘?

早些年的时候,电脑安装系统需要光盘,但是现在光盘也逐渐退出历史舞台。不管是台式计算机还是笔记本,光驱这个东西也逐渐消失。如果自己的计算机没有光驱,电脑又无法开机需要重装系统,这个时候该怎么办呢?可…

jtable隐藏全部_全部隐藏!

jtable隐藏全部在较早的文章中 ,我写了以下几句话: 在面向对象的代码库中,该工具包应尽可能离散。 您使用开发套件的次数越多,您的代码实际面向对象的次数就越少,或者您的抽象并不是最好的。 。 我认为有必要详细说明…

IntelliJ IDEA 如何多模块开发

参考: https://blog.csdn.net/jqc874789596/article/details/86609554

距离矢量路由算法的java代码_八大排序算法比较(附Java代码)

冒泡排序/*** 冒泡排序 比较好理解* 两两相比 较大的放后面* 时间复杂度O(n^2)*//*** 改进前的冒泡排序算法进行100,000数据排序运行时间为:3829ms* 优化后的冒泡排序算法进行100,000数据排序运行时间为:3551ms*/ public static void bubbleSort(int[] a…