【问题标题】:How to remove repeated code between services如何去除服务之间的重复代码
【发布时间】:2013-03-06 22:33:31
【问题描述】:

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

在每个服务中,我都有一个 Helper,它做的事情完全相同,但取决于它们的实体。

我想停止在每个服务上重复代码,因此我正在创建一个实用服务,它将为其他人提供该帮助,我的问题来了:

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

这是来自助手的一个例子:

...
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.
        ...
    }

【问题讨论】:

  • 泛型在这里不会有帮助吗?您可能想发布一些代码 sn-p 来帮助解答。
  • 一些代码会有助于查看,但通常我认为您需要将帮助程序与实体分离以使其可重用。无论是通过泛型还是通用接口等
  • 虽然我不能确定没有一些代码来准确显示你在说什么,但这听起来像是依赖注入的工作!!
  • 我已经编辑了一些代码示例,希望对您有所帮助。 :)
  • 在发布之前,我已经在实用程序服务上创建了接口和抽象类来表示这些实体,让负责的服务扩展并映射到休眠状态,但是在实例化 AnotherEntity 时我被卡住了(我做了抽象) ... :/

标签: java design-patterns service soa


【解决方案1】:

解决了!

A 将公共实体移至公用事业服务项目,但我将表名留空。 在每个服务中,我为指向实用程序服务上的那些实体的外部实体创建了一个映射,并配置了它们的表名。 然后我能够将我所有的助手移动到实用程序服务,因为所有相关实体都在那里。 因此,最终,服务之间没有重复的代码,我仍然可以为每个服务使用不同的表。

无论如何,感谢您的所有帮助!采用不同的方法尝试解决问题真是太好了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2016-12-23
    • 2016-03-28
    • 2011-11-27
    • 2011-02-22
    • 2021-08-06
    • 2013-12-18
    相关资源
    最近更新 更多