我正在使用Struts2,Hibernate和Spring处理中型应用程序来管理sessionFactory的生命周期。我的问题是,我应该创建一个大型服务类,为我的整个应用程序提供所有服务吗?或者应该为每个模型创建一个Service类?
假设我有一个大服务类
@Transactional
public class Services {
// So Spring can inject the session factory
SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory value) {
sessionFactory = value;
}
// Shortcut for sessionFactory.getCurrentSession()
public Session sess() {
return sessionFactory.getCurrentSession();
}
public Event getEventById(long id) {
return (Event) sess().load(Event.class, id);
}
public Person getPersonById(long id) {
return (Person) sess().load(Person.class, id);
}
public void deleteEventById(long id) {
sess().delete(getEventById(id));
}
public void deletePersonById(long id) {
sess().delete(getPersonById(id));
}
public void createEvent(String name) {
Event theEvent = new Event();
theEvent.setName(name);
sess().save(theEvent);
}
public void createPerson(String name) {
Person p = new Person();
p.setName(name);
sess().save(p);
}
@SuppressWarnings("unchecked")
public List<Event> getEvents() {
return sess().createQuery("from Event").list();
}
@SuppressWarnings("unchecked")
public List<Person> getPeople() {
return sess().createQuery("from Person").list();
}
public void removePersonFromEvent(int personId, int eventId) {
getEventById(eventId).getPeople().remove(getPersonById(personId));
}
public void addPersonToEvent(int personId, int eventId) {
getEventById(eventId).getPeople().add(getPersonById(personId));
}
.....Some more services methods here
}
最好的方法是什么?整个应用程序的一大服务类别?或每个型号不同的服务类别?
答案 0 :(得分:3)
Martin Fowler's book on Enterprise Patterns有一些关于构建服务层的好指南。在extract of the book中,您可以找到:
对于足够小的应用程序,只需要一个就足够了 抽象,以应用程序本身命名。在我的经验中 较大的应用程序被分成几个“子系统”,每个子系统 其中包括完整的垂直切片 架构层。
因此,服务层模式中没有石头法则。我觉得你不是小应用程序的情况(你的Services
类有太多的方法),所以一切都减少到你的应用程序识别子系统。本书还推荐与市长抽象相关的服务层(可能是EventService
或PeopleService
)或应用行为(如EventManagementService
);在最后,由您决定项目的最佳代码组织。
答案 1 :(得分:0)
为完整的应用程序创建一个大型服务是没有意义的,它会随着应用程序的增长而开始创建readability
以及maintenance
问题。
遵循模块化方法总是更好。正如@Asag所建议的那样:
为不同的模块创建不同的服务,并定义与服务相关的方法。这将有助于您将功能分开,以及将来将在同一应用程序上工作的任何人。