我想在这里找到两个非常相似的问题的答案:
Should I convert an entity to a DTO inside a Repository object and return it to the Service Layer?
或
Is it okay to return DTO objects from the Repository Layer?
现在我卡在我的 Servlet(Servie 层)中,例如尝试从 RestaurantOwnerRepository 中检索所有 Restaurant 对象:
// RestaurantOwnerService (Servlet)
@Override
@Transactional
public List<RestaurantDTO> getAvailableRestaurants() {
List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());
return null;
}
其中 Restaurant 是一个 @Entity 注释类 - 这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低的 -级别对象,恕我直言,这违反了在每一层中抽象我的数据的尝试。
如果我例如将每个 Restaurant 转换为 RestaurantDTO - 但我应该这样做吗?
基本改变:
// RestaurantOwnerRepository
@Override
public List<Restaurant> getRestaurants(String sessionId) {
RestaurantOwner restaurantOwner = this.get(sessionId);
// .. getting restaurants ..
return availableRestaurants;
}
到
// RestaurantOwnerRepository
@Override
public List<Restaurant> getRestaurants(String sessionId) {
RestaurantOwner restaurantOwner = this.get(sessionId);
// .. getting restaurants ..
return ConvertEntity.convertRestaurants(availableRestaurants);
}
并为 每个 实体设置一个 util ConvertEntity,例如:
public class ConvertEntity {
public static List<RestaurantDTO> convertRestaurants(List<Restaurant> restaurants) {
// ...
}
}
但这对我来说并不是最好的解决方案..我能在这里做什么?
需要提及的一件重要事情 是它来自一个 GWT 项目。这意味着我正在使用例如RestaurantDTO 在服务器端和客户端,因为它包含在一个共享 项目中。
最佳答案
你发表评论后现在更清楚了。让我们再试一次:
首先,一些澄清:
您的 RestaurantOwnerRepository 实现了存储库模式。您的 @Entity 注释对象是 hibernate 实体,也是 DAO 代理。您的 RestaurantOwnerService 是一个 GWT 服务,它只能返回与客户端和服务器共享的 DTO。
因此,在一个非常简单的服务器端设置中,您有一个数据库后端,通过作为持久层的 hibernate 访问数据,以及作为休息服务的服务层。在这样的设置中,您的 hibernate 实体在整个服务器端代码之间共享。例如,您的服务层正在将实体转换为 json 格式。成交?
您的“高级”设置
Repository-Layer 的定义:在我看来,它是对不同数据/持久层的抽象。它不提供业务逻辑,这更多的是进一步业务层的目的。业务层将上层的输出汇总在一起,进行计算并返回结果。但是根据您的评论来看,您的存储库层也可能是这种情况。但我们可以澄清一下。
您的问题:是否可以从存储库层返回 DTO 对象?
回答:不,从“存储库”层返回 DTO 并不是真的好。
原因: 1. 您的 DTO 是一个转换为可以发送到客户端的格式的域实体。它有一些限制,因此无法在其中使用某些服务器端库。 2.考虑你还想提供其他服务层的情况。可能是一个 REST 接口(interface),也可能是另一个 GUI 框架。它们在传输域实体方面都有自己的局限性。您真的要为每个服务层复制存储库层吗? 3. 考虑您想要扩展您的存储库/业务层以便它使用您的RestaurantOwnerRepository 的输出的情况。您真的想在那里从事 DTO 方面的工作吗?
这就是为什么创建 DTO 是服务层的目的。因此,DTO 在客户端和您的服务层之间共享。同样,您需要在服务层和存储库层之间共享的对象。我称这些领域实体。这些从存储层返回并由服务层使用。存储层和持久层之间同样如此。例如,持久层返回在存储层上使用的 Hibernate 实体。
在大多数情况下,可以将对象从多层向下传播。因此,您可以将您的 hibernate 实体从存储库层返回到服务层。较新版本的 GWT 甚至允许通过特殊设置在客户端使用 JPA 实体。因此您的服务层可以进一步返回您的持久化实体。
关于java - 我应该将一个实体转换为 Repository 对象中的 DTO 并将其返回给服务层吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743017/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer