如何删除服务之间重复的代码

时间:2013-03-06 22:33:31

标签: java design-patterns service soa

我有10个原子服务,每个服务都有自己的实体。 (每项服务的分开项目)

在每个服务中,我有一个帮助程序,它确实做同样的事情,但它取决于它们的实体。

我想停止在每个服务上重复代码,所以我正在创建一个实用程序服务,为其他人提供帮助程序,这就是我的问题:

如果我在帮助程序和每个服务的实体之间存在这种依赖关系,我该怎么办?

这是助手的一个例子:

...
SomethingPK somethingPK = toSomethingPK(something);
SomethingEntity somethingEntity = (SomethingEntity)session.get(SomethingEntity.class, somethingPK);
somethingEntity = toSomethingEntity(something);
AnotherEntity another = new AnotherEntity();
//attribute sets
somethingEntity.setAnother(another);
...

每个服务都有自己的SomethingPK,SomethingEntity和AnotherEntity作为Hibernate上的映射实体。 我怎样才能松开这种联系?

有道理吗?

今天:重复的代码,如

ServiceABC项目

abc.entities.AbcType (DTO)
abc.entities.AbcEntity (Entity)
abc.entities.AbcPK (Entity's PK)
abc.entities.AbcAnotherEntity (Entity)
abc.helpers.CommonHelper (Bean)



abc.helpers.CommonHelpers.createSomethingThatIsNotBusinessLogic(Session session, AbcType abc) {
        ...
        AbcPK key = parseToAbcPK(abc);
        AbcEntity abcEntity = (AbcEntity)session.get(AbcEntity.class, key);
        abcEntity = parseToAbcEntity(abc);
        AbcAnotherEntity abcAnother = new AbcAnotherEntity();
        AbcEntity.setAnother(another);
        ...
    }

ServiceXYZ项目

xyz.entities.XyzType
xyz.entities.XyzEntity
xyz.entities.XyzPK
xyz.entities.XyzAnotherEntity
xyz.helpers.CommonHelper



xyz.helpers.CommonHelpers.createSomethingThatIsNotBusinessLogic(Session session, XyzType xyz) {
        ...
        XyzPK key = parseToXyzPK(xyz);
        XyzEntity xyzEntity = (XyzEntity)session.get(XyzEntity.class, key);
        xyzEntity = parseToXyzEntity(xyz);
        XyzAnotherEntity xyzAnother = new XyzAnotherEntity();
        XyzEntity.setAnother(another);
        ...
    }

需要重构来实现这样的事情:

ServiceABC项目

abc.entities.AbcType (DTO)
abc.entities.AbcEntity (Entity)
abc.entities.AbcPK (Entity's PK)
abc.entities.AbcAnotherEntity (Entity)

ServiceXYZ项目

xyz.entities.XyzType
xyz.entities.XyzEntity
xyz.entities.XyzPK
xyz.entities.XyzAnotherEntity

ServiceUtilities项目

utilities.CommonHelper


utilities.helpers.CommonHelpers.createSomethingThatIsNotBusinessLogic(Session session, ?Type type) {
        ...
        //same code prepared to deal with any entity, entityPK or type.
        ...
    }

1 个答案:

答案 0 :(得分:0)

解决!

A将公共实体移动到Utility Service Project,但我将表名留空。 在每个服务中,我为指向实用程序服务上的那些实体的外部实体创建了映射,并配置了它们的表名。 然后,我能够将所有帮助程序移动到Utility Service,因为所有相关实体都在那里。 所以,最后,服务中没有重复的代码,我仍然可以为每个代码提供不同的表。

感谢您的所有帮助!尝试解决一些不同的方法真是太好了。

如何将此问题标记为已解决?