2013-03-06 60 views
1

我有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

泛型不會在這裏有所幫助嗎?你可能想發佈一些代碼片段來幫助解答。 – benzonico 2013-03-06 22:35:48

+2

有些代碼會有助於查看,但通常我認爲您需要將您的幫助器與實體分離以使其可重用。無論是通過泛型還是通用接口等。 – 2013-03-06 22:38:23

+0

雖然我無法確定沒有一些代碼來準確顯示您在說什麼,但這聽起來像是依賴注入的工作! – Aurand 2013-03-06 22:48:39

回答

0

解決!

A將公共實體移至Utility Service Project,但我將表名稱留空。 而且在每一項服務中,我都爲外部實體創建了一個映射,指向實用程序服務上的這些實體並配置它們的表名。 然後,我可以將所有幫助者移到Utility Service中,因爲所有相關的實體都在那裏。 因此,最終,跨服務不存在重複代碼,我仍然可以爲每個服務提供不同的表。

謝謝你的幫助!嘗試解決一些不同的方法是很棒的。

如何將此問題標記爲已解決?