- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 spring/hibernate/jsp 和典型层的标准堆栈的 Java EE 应用程序:
每个存储库都有许多查找...方法(例如,对于 BookRepository:简单的 findById、findByTitle、findByAuthor,更复杂的 findMostUsed、findMostCommented 等)
服务层包含调用存储库的业务逻辑。
Controller 调用服务方法并填充要在 JSP 中使用的 ModelAndView。
当然,服务中也有一些方法和一些复杂的业务逻辑。但令人讨厌的是,有很多像这样的愚蠢方法:
public List<Book> findMostUsed() {
return repository.findMostUsed();
}
public List<Book> findMostCommented (boolean includeRating) {
return repository.findMostCommented(includeRating);
}
...
所以它们只是一个简单的委托(delegate)(这些查找方法中没有业务逻辑 - 存储库中的数据库查询完成所有选择和分组)。
如果我需要更改存储库中的方法,则服务也需要更改。经过 2 年的开发,无需向这些方法添加任何逻辑 - 仅更改了查询及其参数。
我看到了更糟糕的设计,人们创建了 Controller -> Facade -> Service -> Repository -> DAO,每一层都充满了这样的方法。
什么是更好的设计?
也许删除所有这些方法并将服务转换为更通用(例如 BookPricingService、BookRatingService 等,而不是单一的 BookService(顺便说一句,这违反了单一职责原则)?然后 Controller 将同时调用 Service 和 Repository 层,这是不好。
也许可以使查找方法更通用,例如 findByCriteria(criteria) 以减少它们的数量。但问题是查询是如此不同,这将以一种 switch-case block 结束,它根据条件类型选择正确的查询/参数。顺便说一句,Spring-Data 还建议使用 @Query 注释为每个查询使用一种方法。
也许这就是我们拥有抽象层应该付出的代价?
最佳答案
对于像这样的简单 getter,我只是将 @Repository
直接注入(inject)到我的 @Controller
或需要的地方 @Service
,并注释带有 @Transactional(propagation = Propagation.REQUIRED)
的存储库。该注释指出该方法必须在事务中使用,并且如果不存在则创建一个(但如果已经在事务中则不会创建第二个)。
当操作多个根聚合/实体时,应该使用服务类——即当有两种类型的存储库时。由于服务将一个工作单元所需的方法捆绑在一起,因此它们是同一事务的一部分。
我也厌倦了不同的模式和依赖关系。
我还使用 critera 查询和 generics避免许多非常相似的方法,例如:
@Transactional(readOnly = true)
public <T> List<T> getFieldLike(String fieldName, String value) {
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(genericType).add(Restrictions.ilike(fieldName, value, MatchMode.ANYWHERE));
return crit.list();
}
@Transactional(readOnly = true)
public <T> List<T> getFieldsEq( final Map<String, Object> restrictions) {
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(genericType);
for (final Map.Entry<String, Object> entry : restrictions.entrySet()) {
crit.add(Restrictions.eq(entry.getKey(), entry.getValue()));
}
return crit.list();
}
关于spring - Controller、Service、Repository 和简单的委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15410523/
我看了很多文章,但我仍然不清楚我们通常创建的普通委托(delegate)和多播委托(delegate)之间的区别。 public delegate void MyMethodHandler(objec
考虑以下几点: Action a1 = new Action(_insert); Action a2 = new Action(a1); a2 指的是什么?它是 a1,a1 的浅拷贝还是 a1 的深拷
我希望这听起来像是一个显而易见的问题,但是委托(delegate)返回类型是否也必须与其委托(delegate)的方法的返回类型相匹配? EG,像这样: public static void Save
我想使用 Kotlin 委托(delegate),但我不想在委托(delegate)人之外创建委托(delegate)。委托(delegate)的所有示例都如下所示: interface Worker
class SuperClass { var delegate : SuperClassDelegate? } protocol SuperClassDelegate { func d
我有一个加载 View 的 View ,需要将 View 推送到主导航 Controller 。 我已经为每个 View 设置了一个委托(delegate),并且基本上使我的调用沿着“链”返回到主导航
为简单起见,假设我想创建一个自定义 UITextField 并向其添加一个简单的行为;也就是说,如果文本字段成为第一响应者,背景颜色将变为绿色。 为此,在我的自定义类中,我必须将该类设置为委托(del
我非常有信心我应该能够使用非静态方法的委托(delegate),但下面给了我一个错误: public class TestClass { private delegate void TestD
在 C# 中不能从 System.Delegate 或 System.MulticastDelegate 继承。只要您声明标准的“运行时托管”方法,就完全可以在 MSIL 中执行此操作。但是,每次我向
我在 Storyboard 中定义了一个 iPad 界面,带有一个 SplitViewController。我想将 SplitViewController 的委托(delegate)设置为指向详细 C
我有几个解析器。有一个顶级的可以委托(delegate)给另一个。 Parser我们从 Reader 中获取他们的输入(可变)。我只想要一个 Parser为了能够一次解析,只有一个解析器应该有 Rea
一直以来我都在阅读关于反射的文章,每个人都在说:“反射很慢”,“反射很慢”。 现在我决定测试速度有多慢,令我惊讶的是,使用反射创建的委托(delegate)实际上是使用 lambda 创建的委托(de
在 Xcode 4.5 中启动了 Cocos2D 2.1 模板(没有物理引擎),针对 iOS 6 和 iPad。在 CDAudioManager.m 文件中,以下代码... AVAudioSessio
以下是来自未管理的 dll 的函数代码。它接受一个函数指针作为参数,并简单地返回被调用函数返回的值。 extern __declspec(dllexport) int _stdcall callDe
//NewCharts.h #import @interface NewCharts : UIViewController @property(nonatomic,retain)IBOutlet U
鉴于以下 MSDN 示例代码,为什么我不能定义 Action 委托(delegate)“内联”: public static void Main(string[] args) { Action
在虚幻引擎中,UFUNCTION用于通过附加说明符来丰富功能,以用于蓝图使用、复制和委托(delegate)。 然而,一些委托(delegate)类型似乎不允许绑定(bind) UFUNCTION(如
我刚刚将照片选择器放入我的项目中,一切正常。唯一的事情是它坚持在我设置委托(delegate)的地方给我以下警告 - Assigning to 'id' from incompatible type
我有一个 UIImageView 的子类,并且想将 self 作为参数传递给委托(delegate)。我在 MyImageView 之前收到错误“预期 ')'”。我需要将对象传递给委托(delegat
我正在开发 iOS 10 的语音转文本功能。 我希望调用 SFSpeechRecognitionTaskDelegate 的委托(delegate)方法来检查完成的结果。 func speechRec
我是一名优秀的程序员,十分优秀!