在开始转向六边形架构之前,我的应用程序(大致)有这些罐子,聚集成一个更大的可执行文件。
(更准确地说,对于下面的评论:具体来说,我的每个Maven子项目(
<module>
)都有一个<packaging>jar</packaging>
类型,最后,应用程序组件通过org.springframework.boot:spring-boot-maven-plugin:repackage
将所有内容收集到一个可执行jar中
插件。BOOT-INF/lib
里面看到我的七八个小罐子,在大量的 Spring、Spark、Jakata API 罐子中)。
0) 在开始迁移到六边形架构之前,这是我对组件/Maven 模块/IDE 子项目的粗略调度:
Business Object.jar
Association.jar
. Spark Dataset
. Association Service
. Association REST Controller
Catalogue.jar
. Spark Dataset
. Association Service
. Association REST Controller
Comptes.jar
. Spark Dataset
. Association Service
. Association REST Controller
[seven others like these: Cities/Departments/Regions, Emploi,
Entreprise, Equipement, Formation, Mobilite, Revenus Imposition]
Main Spring Backend Application.jar
Angular Web Application.war
现在,六边形架构正在拆分,例如,协会管理分为:
adapters.inbound.port.AssociationAPI
adapters.inbound.rest.AssociationController
adapters.outbound.port.AssociationRepository
adapters.outbound.spark.dataset.association.AssociationObjetsSociauxDataset
adapters.outbound.spark.dataset.association.AssociationWaldecDataset
adapters.outbound.spark.analyse.association.AssociationAnalyseSpark
application.port.AssociationPort
application.service.AssociationService
domain.model.territoire.association.AncienNumeroWaldec
domain.model.territoire.association.Association
domain.model.territoire.association.NumeroRUP
domain.model.territoire.association.NumeroWaldec
domain.model.territoire.association.RegroupementAssociation
我是六边形建筑的新手。第一次应用,类名和接口名在脑子里还是有点不准确
1) 如果我考虑我打算部署的罐子,我是否应该在这样的事情面前,在我的工作结束时?
adapters.inbound.port.AssociationAPI
adapters.inbound.port.CatalogueAPI
adapters.inbound.port.ComptesAPI
==> For a jar #1
adapters.inbound.rest.AssociationController
adapters.inbound.rest.CatalogueController
adapters.inbound.rest.ComptesController
==> for a jar #2
adapters.outbound.port.AssociationRepository
adapters.outbound.port.CatalogueRepository
adapters.outbound.port.ComptesRepository
==> for a jar #3
adapters.outbound.spark.dataset.association.AssociationObjetsSociauxDataset
adapters.outbound.spark.dataset.association.AssociationWaldecDataset
adapters.outbound.spark.dataset.datagouv.CatalogueDatagouvDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesIntercommunalitesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesCommunesDataset
adapters.outbound.spark.dataset.individuel.AbstractComptesIndividuelsDataset
adapters.outbound.spark.dataset.individuel.communes.ComptesIndividuelsCommunesDataset
adapters.outbound.spark.dataset.individuel.intercommunalites.ComptesIndividiuelsIntercommunalitesDataset
adapters.outbound.spark.dataset.plan.comptes.PlanDeComptesDataset
==> for a jar #4
adapters.outbound.spark.analyse.association.AssociationAnalyseSpark
==> for a jar #5
application.port.AssociationPort
application.port.CataloguePort
application.port.ComptesPort
==> for a jar #6
application.service.AssociationService
application.service.CatalogueDatagouvService
application.service.BalanceCompteService
==> for a jar #7
domain.model.territoire.association.AncienNumeroWaldec
domain.model.territoire.association.Association
domain.model.territoire.association.NumeroRUP
domain.model.territoire.association.NumeroWaldec
domain.model.territoire.association.RegroupementAssociation
domain.model.catalogue.CatalogueId
domain.model.catalogue.JeuDeDonnees
domain.model.catalogue.OrganisationId
domain.model.catalogue.metadata.DebutOuFinPeriode
domain.model.catalogue.metadata.MetadataSource
domain.model.catalogue.metadata.NatureDonnee
domain.model.catalogue.metadata.NaturePhysiqueSource
domain.model.catalogue.metadata.Periode
domain.model.catalogue.metadata.PeriodiciteSource
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecRatioStructure
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecMoyenneStrate
domain.model.territoire.comptabilite.ComptesIndividuelsIntercommunalite
domain.model.territoire.comptabilite.Compte
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtRatioStructureEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtTauxVoteEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesTotalOuBaseEtParHabitant
domain.model.territoire.comptabilite.ComptesIndividuels
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecTauxVote
domain.model.territoire.comptabilite.NumeroCompte
domain.model.territoire.comptabilite.ComptesIndividuelsCommune
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.RatiosNiveauxEtStructure
==> for a jar #8
在我看来很简单,但是把每个业务都放在一个罐子里似乎很混乱和麻烦。
2) 相反,我是否应该达到这样的结果,完全被商业概念和六边形性质所分裂?
adapters.inbound.port.AssociationAPI
==> for a jar #1
adapters.inbound.port.CatalogueAPI
==> for a jar #2
adapters.inbound.port.ComptesAPI
==> For a jar #3
adapters.inbound.rest.AssociationController
==> for a jar #4
adapters.inbound.rest.CatalogueController
==> for a jar #5
adapters.inbound.rest.ComptesController
==> for a jar #6
adapters.outbound.port.AssociationRepository
==> for a jar #7
adapters.outbound.port.CatalogueRepository
==> for a jar #8
adapters.outbound.port.ComptesRepository
==> for a jar #9
adapters.outbound.spark.dataset.association.AssociationObjetsSociauxDataset
adapters.outbound.spark.dataset.association.AssociationWaldecDataset
==> for a jar #10
adapters.outbound.spark.dataset.datagouv.CatalogueDatagouvDataset
==> for a jar #11
adapters.outbound.spark.dataset.balance.communes.BalanceComptesIntercommunalitesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesCommunesDataset
adapters.outbound.spark.dataset.individuel.AbstractComptesIndividuelsDataset
adapters.outbound.spark.dataset.individuel.communes.ComptesIndividuelsCommunesDataset
adapters.outbound.spark.dataset.individuel.intercommunalites.ComptesIndividiuelsIntercommunalitesDataset
adapters.outbound.spark.dataset.plan.comptes.PlanDeComptesDataset
==> for a jar #12
adapters.outbound.spark.analyse.association.AssociationAnalyseSpark
==> for a jar #13
application.port.AssociationPort
==> for a jar #14
application.port.CataloguePort
==> for a jar #15
application.port.ComptesPort
==> for a jar #16
application.service.AssociationService
==> for a jar #17
application.service.CatalogueDatagouvService
==> for a jar #18
application.service.BalanceCompteService
==> for a jar #19
domain.model.territoire.association.AncienNumeroWaldec
domain.model.territoire.association.Association
domain.model.territoire.association.NumeroRUP
domain.model.territoire.association.NumeroWaldec
domain.model.territoire.association.RegroupementAssociation
==> for a jar #20
domain.model.catalogue.CatalogueId
domain.model.catalogue.JeuDeDonnees
domain.model.catalogue.OrganisationId
domain.model.catalogue.metadata.DebutOuFinPeriode
domain.model.catalogue.metadata.MetadataSource
domain.model.catalogue.metadata.NatureDonnee
domain.model.catalogue.metadata.NaturePhysiqueSource
domain.model.catalogue.metadata.Periode
domain.model.catalogue.metadata.PeriodiciteSource
==> for a jar #21
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecRatioStructure
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecMoyenneStrate
domain.model.territoire.comptabilite.ComptesIndividuelsIntercommunalite
domain.model.territoire.comptabilite.Compte
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtRatioStructureEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtTauxVoteEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesTotalOuBaseEtParHabitant
domain.model.territoire.comptabilite.ComptesIndividuels
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecTauxVote
domain.model.territoire.comptabilite.NumeroCompte
domain.model.territoire.comptabilite.ComptesIndividuelsCommune
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.RatiosNiveauxEtStructure
==> for a jar #22
对于数量可观的罐子,因此:很多子项目?
在我的应用程序重新调度结束时,我可能很快就会有 100 个罐子。
3) 还是只按六边形全局性质调度,然后:商业概念?
adapters.inbound.port.AssociationAPI
adapters.inbound.rest.AssociationController
==> for a jar #1
adapters.inbound.port.CatalogueAPI
adapters.inbound.rest.CatalogueController
==> for a jar #2
adapters.inbound.port.ComptesAPI
adapters.inbound.rest.ComptesController
==> for a jar #3
adapters.outbound.port.AssociationRepository
adapters.outbound.spark.dataset.association.AssociationObjetsSociauxDataset
adapters.outbound.spark.dataset.association.AssociationWaldecDataset
adapters.outbound.spark.analyse.association.AssociationAnalyseSpark
==> for a jar #4
adapters.outbound.port.CatalogueRepository
adapters.outbound.spark.dataset.datagouv.CatalogueDatagouvDataset
==> for a jar #5
adapters.outbound.port.ComptesRepository
adapters.outbound.spark.dataset.balance.communes.BalanceComptesIntercommunalitesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesCommunesDataset
adapters.outbound.spark.dataset.individuel.AbstractComptesIndividuelsDataset
adapters.outbound.spark.dataset.individuel.communes.ComptesIndividuelsCommunesDataset
adapters.outbound.spark.dataset.individuel.intercommunalites.ComptesIndividiuelsIntercommunalitesDataset
adapters.outbound.spark.dataset.plan.comptes.PlanDeComptesDataset
==> for a jar #6
application.port.AssociationPort
application.service.AssociationService
==> for a jar #7
application.port.CataloguePort
application.service.CatalogueDatagouvService
application.port.ComptesPort
application.service.BalanceCompteService
==> for a jar #8
domain.model.territoire.association.AncienNumeroWaldec
domain.model.territoire.association.Association
domain.model.territoire.association.NumeroRUP
domain.model.territoire.association.NumeroWaldec
domain.model.territoire.association.RegroupementAssociation
domain.model.catalogue.CatalogueId
domain.model.catalogue.JeuDeDonnees
domain.model.catalogue.OrganisationId
domain.model.catalogue.metadata.DebutOuFinPeriode
domain.model.catalogue.metadata.MetadataSource
domain.model.catalogue.metadata.NatureDonnee
domain.model.catalogue.metadata.NaturePhysiqueSource
domain.model.catalogue.metadata.Periode
domain.model.catalogue.metadata.PeriodiciteSource
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecRatioStructure
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecMoyenneStrate
domain.model.territoire.comptabilite.ComptesIndividuelsIntercommunalite
domain.model.territoire.comptabilite.Compte
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtRatioStructureEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtTauxVoteEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesTotalOuBaseEtParHabitant
domain.model.territoire.comptabilite.ComptesIndividuels
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecTauxVote
domain.model.territoire.comptabilite.NumeroCompte
domain.model.territoire.comptabilite.ComptesIndividuelsCommune
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.RatiosNiveauxEtStructure
==> for a jar #9
在这里,子模块的数量会减少,但是出站适配器 jars [每种业务概念] 可以在最后看到 Spark、Postgresql 等内部的混合,对于 adapters.inbound,我会发现自己在休息、角度应用等。
如果我变得一丝不苟并希望通过 Java 9 模块系统管理它们,我该如何检查它们的边界?
这也很奇怪。但一开始我可以为我的 Maven 模块/子项目(这导致最终收集到最终应用程序可执行 jar 中的 jar)。