我正在尝试用Java编写嵌入式( NOT web,而不是企业)内容管理系统,重点是组织和易用性以及可扩展到100,000个左右的项目。用户&系统应该能够创建和定义可以与唯一资源相关联的元数据项,以允许搜索。
例如,他们可以创建一个带有String值的标签“ProjectName”。然后他们可以将一堆资源标记为属于“接管世界”或“修复我的车”的项目。标签是强类型的,因此标签可以存储单个或多个字符串,整数,双(等)等。每个标签类型都应该有格式化器和输入验证器以允许编辑。
我已经决定从GUI中抽象存储模型,以实现可扩展性;显而易见的方法是为每个资源使用数据访问对象(DAO)。但是,我无法弄清楚如何编写支持可变数量标签的DAO并且可以正确扩展。
问题是资源需要表现为元组(用于表格查看/排序/过滤)和(TagName,TagValue)映射。对于每次GUI更新,GUI模型可能会为这些方法调用数千次,因此索引的一些概念会使它更好地工作。不幸的是,多个标签类型意味着它会很尴尬,除非我将所有内容作为通用对象返回并完成一堆“TagValue instanceof Type”条件。
我已经研究过使用反射和Apache的DynaBeans,但编码它以使用GUI模型看起来很痛苦和尴尬。有一个更好的方法吗???一些图书馆或设计模式?
所以,我的问题是,有更好的方法吗?一些图书馆或设计模式只是这整个事情?
答案 0 :(得分:1)
我从您的问题中假设“资源”是系统中具有与之关联的一些“标记”实体的实体。如果我的假设是正确的,这是一个香草DAO界面,请告诉我这是否是您的想法:
public interface ResourceDAO {
void store(Resource resource);
void remove(Resource resource);
List<Resource> findResources(QueryCriteria criteria);
void addTagsToResource(Resource resource, Set<Tag> tags);
}
这里的想法是,您将为可用的任何数据存储机制实现此接口,并且应用程序将通过此接口访问它。实施类的实例将从工厂获得。
这符合您的想法吗?
您提到的问题的另一个方面是必须与多种不同的TagType竞争,这些TagType需要不同的行为,具体取决于类型(需要“TagValue instanceof Type”条件)。 Visitor pattern可以优雅地为您处理此问题。
答案 1 :(得分:1)
答案 2 :(得分:0)
您是否依赖于使用关系数据库?研究面向文档的数据库(例如couchDB)可能是值得的。它将为您提供存储所需的任意强类型对象所需的灵活性,并使您能够查询这些对象。我相信还有一些用于访问couchDB的Java库。