- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用Java编写嵌入式(非Web,不是企业)内容管理系统,重点是组织和易用性以及可扩展到100,000个左右的项目。用户和系统应该能够创建和定义可以与唯一资源关联的元数据项,以便进行搜索。
例如,他们可以创建带有字符串值的标签“ ProjectName”。然后,他们可以将一堆资源标记为属于“ Take Over the World”或“ Fix My Car”项目。标签是强类型的,因此标签可以存储单个或多个字符串,整数,双精度型等。每种标签类型都应具有格式化程序和输入验证器以允许编辑。
我认为从GUI提取存储模型很重要,以实现可伸缩性。这样做的明显方法是为每个资源使用数据访问对象(DAO)。但是,我不知道如何编写支持可变数量的标签并且可以正确缩放的DAO。
问题在于资源需要既表现为元组(用于表格查看/排序/过滤)又表现为(TagName,TagValue)映射。对于每个GUI更新,GUI模型可能会调用这些方法数千次,因此某种索引概念会使它们全部工作得更好。不幸的是,多个标记类型意味着除非我将所有内容都作为通用对象返回并完全破坏“ TagValue instanceof Type”条件,否则它将很尴尬。
我已经研究过使用反射和Apache的DynaBeans,但是对其进行编码以与GUI模型一起使用看起来很痛苦且笨拙。有一个更好的方法吗???一些库或设计模式?
所以,我的问题是,有没有更好的方法?一些库或设计模式可以简单地完成整个工作吗?
最佳答案
我认为您不应该将任何这些属性视为实际的成员变量。您应该有一个“属性”对象,它包含一个属性(类似于成员变量),还有一个“集合”对象,它具有多个属性集合(就像一个类)。
由于这些属性和集合实际上没有与之关联的代码,因此将它们实现为对象没有任何意义(这确实是一个痛苦)
您的属性和集合需要保存所有特定于它们的数据。例如,如果某个字段最终写入数据库,则需要将其表名存储在某个位置。如果需要将其写入屏幕,则还需要将其存储在某个位置。
可以将范围/值检查“添加”到属性中,因此,当定义属性是什么类型的数据时,可能会有一些文本显示为“ MaxLength(12)”,该文本将实例化名为MaxLength的值12的类。并将该类存储到属性中。每当属性的值更改时,新值就会传递到已应用于此类的每个范围检查器。与该类关联的动作可以有很多类型。
这只是基础。我已经设计出了类似的东西,虽然需要很多工作,但是比尝试使用简单的语言要简单得多。
我知道现在这似乎做得太多了(如果您确实得到了我的建议,应该这样做),但是请牢记这一点,最终您可能会选择“ Hmph,也许这值得一试” 。
编辑(回复评论):
我考虑过尝试使用注册表/关键内容(我们仍在讨论属性值对),但这并不完全适合。
您正在尝试将DAO装入Java对象。这确实很自然,但是我已经将其视为解决DAO / DTO问题的一种不好的方法。 Java对象具有属性和对这些属性起作用的行为。对于您正在做的事情,没有任何行为(例如,如果用户创建“生日”字段,您将不会使用对象代码来计算其年龄,因为您实际上并不知道生日是什么)。
因此,如果不使用对象和属性,该如何存储这些数据?
让我开始一个非常简单的第一步(非常接近您提到的注册表/标签系统):在要使用对象的地方,请使用哈希表。对于属性名称,请使用键,对于属性值,请使用哈希表中的值。
现在,我将介绍为增强此简单模型而遇到的问题和解决方案。
问题:
您已经丢失了“强类型”,并且您的数据是非常自由的格式(可能很糟糕)
解:
为哈希表中的值使用的“属性”创建基类。为IntegerAttribute,StringAttribute,DateAttribute扩展该基类。...不允许使用不适合该类型的值。现在您可以进行强类型化,但是它是运行时而不是编译时-可能还可以,因为您的数据实际上还是在运行时定义的。
问题:
格式器和验证器
解:
能够为您的属性基类创建一个插件。您应该能够为任何属性使用“ setValidator”或“ setFormatter”。验证器/格式化程序应与属性一起使用-因此在保存属性时,您可能必须能够将它们序列化到DB。
这里的好处是,当您对属性执行“ attribute.getFormattedValue()”时,该属性已预先格式化以供显示。如果任何验证失败,attribute.setValue()将自动调用验证器并抛出异常或返回错误代码。
问题:
如何在屏幕上显示这些内容?我们已经有getFormatted(),但是它在屏幕上显示在哪里?我们如何使用标签?什么样的控件应该编辑此字段?
解:
我会将所有这些内容存储在EACH属性中。 (顺序应该存储在Class中,但是由于这是一个哈希表,因此将无法正常工作-好吧,我们接下来将继续讨论该顺序)。如果存储显示名称,用于呈现此显示的控件类型(文本字段,表格,日期等)和数据库字段名称,则此属性应具有与显示和数据库I /交互所需的所有信息。编写用于处理属性的O例程。
问题:
哈希表对于DAO而言是不良的接口。
解:
这是绝对正确的。您的哈希表应该包装在一个类中,该类知道它所保存的属性的集合。它应该能够将自身(包括其所有属性)存储到数据库中-可能借助于辅助类。它可能应该能够通过一个方法调用来验证所有属性。
问题:
如何实际使用这些东西?
解:
由于它们包含自己的数据,因此在系统中它们进行交互的任何位置(例如与屏幕或与DB交互),都需要一个“适配器”。
假设您要显示一个屏幕来编辑数据。您的适配器将被传递一个框架和一个基于哈希表的DTO。
首先,它将按顺序遍历属性列表。它会询问第一个属性(例如一个字符串),它想使用哪种控件进行编辑(比如说一个文本字段)。
它将创建一个文本字段,然后在该文本字段中添加一个侦听器以更新数据,这会将您的数据绑定到屏幕上的控件。
现在,无论何时用户更新控件,更新都将发送到属性。该属性存储新值,完成。
(这将因“确定”按钮的概念而变得复杂,该按钮可一次传输所有值,但我仍然会事先设置每个绑定并将“确定”用作触发器。)
这种绑定可能很困难。一旦使用了内置了某些绑定功能的名为“ JGoodies”的工具包,我就手动完成了这一工作,因此我不必自己编写每种可能的绑定组合,但是从长远来看,我不确定它节省了很多时间。
这太长了。我应该有朝一日创建一个DAO / DTO工具包-我认为Java对象根本不适合DAO / DTO对象。
如果您仍然感到困惑,请随时给我发送电子邮件/即时通讯-gmail.bill.kress。
关于java - 如何为具有可扩展属性的资源编写DAO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/783198/
有人告诉我,如果我只有一个“东西”,比如家(不是多个家),我应该在 routes.rb 中使用资源 :home,而不是资源 :home。但是当我查看路由时,POST 函数似乎想要 home#creat
Activity 开始。这些代码框架顺利通过。 // Initialize array adapters. One for already paired devices and //
资源 search-hadoop.com search-hadoop.com索引所有邮件列表,非常适合历史搜索。当你遇到问题时首先在这里搜索,因为很可能有人已经遇到了你的问题。 邮件列表 在A
我是 WPF 的新手,正在努力使用位于单独程序集中的样式。这就是我正在做的:- 我有一个带有\Themes 文件夹的类库项目,其中包含一个“generic.xaml”,它合并了\Themes 内的子文
我正在编写一个使用虚拟树状文件结构的插件。基本上它就像一个包含文件的标准文件系统,区别在于这些文件实际上并不存在于文件系统中的特定位置,而只是 java 对象。 这些当前由使用 SettingProv
如果我在 XAML 中使用以下内容,我会收到错误消息: 错
我正在使用 laravel 资源来获取 api 的数据: return [ 'id' => $this->id, 'unread' =>
我有以下 pom.xml: 4.0.0 mycompany resource-fail 0.0.1-SNAPSHOT BazBat
许多GDI +类都实现IDisposable,但是我不确定何时应该调用Dispose。对于使用new或静态方法(例如Graphics.CreateGraphics)创建的实例来说,这很明显。但是,由属
我正在构建一组 RESTful 资源,其工作方式如下:(我将使用“people”作为示例): 获取/people/{key} - 返回一个人对象 (JSON) GET/people?first_nam
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一个使用 $resource 的简单 Controller : var Regions = $resource('mocks/regions.json'); $scope.regions =
在 Azure 门户中,如何查看不同资源之间的依赖关系。我特别想查看哪些资源正在使用我要删除的存储。 最佳答案 您可以使用应用程序洞察应用程序 map 来执行此操作: 您还可以打开存储帐户的日志记录:
我正在使用 ionic 生成资源(图标和启动画面)。我正在使用 ionic v2.1.0 和 cordova v6.4.0。 到目前为止我一直在使用(它在以前的版本中工作): cordova plat
是否可以使用 Assets 包含子文件夹中的文件? 示例:[base_url]/assets/css/pepper-grinder/jquery-ui-1.8.11.custom.min.css 最佳
我正在阅读一些尝试教授 Android 开发的书。在书中,作者概述了 res/下的一些目录。他提到 res/menu 包含基于 XML 的菜单规范。他还提到了保存“通用文件”的 res/raw。当我创
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在服务器上使用 express-resource。在我的 AngularJS Controller 中: var User = $resource('/services/users/:use
因此,每当我运行我的应用程序时,它都会立即崩溃并给出以下错误: No package identifier when getting value for resource number 0x00000
对于我正在创建的(网络)应用程序,我需要使用基本身份验证在我的 UIWebView 中加载页面。 现在设置我使用的授权 header : NSString *result = [NSString st
我是一名优秀的程序员,十分优秀!