Domain driven design OSGi应用程序设计与DDD

Domain driven design OSGi应用程序设计与DDD,domain-driven-design,osgi,ddd-repositories,Domain Driven Design,Osgi,Ddd Repositories,在阅读了和之后,我现在陷入了一个紧迫的问题:如何应用“不要编写OSGi”的咒语 假设有界上下文是整个应用程序,而不是单个捆绑包,我应该可以自由地在API捆绑包中声明一些聚合根实体,并以DDD样式声明用于处理所述实体的存储库。现在,问题的关键是:显式存储库似乎与OSGi风格相反,因为存储库本身就是(域对象的)注册表,而这种设计避开了OSGi服务注册表。但要取消存储库,消费者需要编写OSGi以执行实体的查找 据说存储库只是一个外表——这是否意味着我应该创建一个存储库实现,它将委托给服务注册中心?这似

在阅读了和之后,我现在陷入了一个紧迫的问题:如何应用“不要编写OSGi”的咒语

假设有界上下文是整个应用程序,而不是单个捆绑包,我应该可以自由地在API捆绑包中声明一些聚合根实体,并以DDD样式声明用于处理所述实体的存储库。现在,问题的关键是:显式存储库似乎与OSGi风格相反,因为存储库本身就是(域对象的)注册表,而这种设计避开了OSGi服务注册表。但要取消存储库,消费者需要编写OSGi以执行实体的查找

据说存储库只是一个外表——这是否意味着我应该创建一个存储库实现,它将委托给服务注册中心?这似乎不是一种连贯的方法,因为使用者在域模型中有两个入口点:存储库和服务注册中心本身。放弃存储库将不再是DDD,因为我们回到了以意大利面条式的方式将域逻辑与框架代码混合在一起


那么这里的外卖是什么?域驱动设计是否与“OSGi方式”不兼容,或者我是否缺少一些关键概念?

我认为您应该简单地将存储库注册为OSGi服务。需要存储库的bundle应该引用服务,并且应该只知道存储库接口。当然,这意味着您必须在Activator中使用ServiceTracker或蓝图上下文。我更喜欢blueprint上下文,因为这样您对OSGi没有真正的java级依赖

当然,这在某种程度上造成了对OSGi的依赖,但这是无法避免的。遵循的基本思想是,您应该将特定于OSGi的代码保留在业务代码之外,并将其放在单独的类或blueprint中

请参阅我的一篇教程,其中展示了一个带有UI、模型和持久化impl的简单应用程序。虽然应用程序太小,无法真正实现DDD,但aproach应该相当兼容。您会注意到,整个应用程序并不导入单个OSGi接口。一个很好的副作用是,您可以轻松地在OSGi之外重用代码,但当然,您必须以不同的方式解决DI


我认为您应该简单地将存储库注册为OSGi服务。需要存储库的bundle应该引用服务,并且应该只知道存储库接口。当然,这意味着您必须在Activator中使用ServiceTracker或蓝图上下文。我更喜欢blueprint上下文,因为这样您对OSGi没有真正的java级依赖

当然,这在某种程度上造成了对OSGi的依赖,但这是无法避免的。遵循的基本思想是,您应该将特定于OSGi的代码保留在业务代码之外,并将其放在单独的类或blueprint中

请参阅我的一篇教程,其中展示了一个带有UI、模型和持久化impl的简单应用程序。虽然应用程序太小,无法真正实现DDD,但aproach应该相当兼容。您会注意到,整个应用程序并不导入单个OSGi接口。一个很好的副作用是,您可以轻松地在OSGi之外重用代码,但当然,您必须以不同的方式解决DI


不依赖OSGi的理由是,作为中间件,OSGi在代码中的可见性会降低代码的内聚性。域代码和OSGi代码不应该混合(就像它不应该与JMS、JavaEE或任何其他API混合一样)。内聚性较差的代码更复杂,因此容易出错

然而,您总是需要一些桥接代码来将基础结构链接到域代码。因为这个桥接代码无论如何都要耦合到一些API,所以充分利用它,从桥接代码的环境中抽象自己是绝对没有用的

DS(和Blueprint、iPOJO等)为业务逻辑隐藏注册表,它们只是提供域注册表的非常方便的方法。因此,使用OSGi,如果域对象本身不知道OSGi,您几乎不需要编写任何代码就可以拥有非常强大的域对象存储库

是的,如果您将代码从OSGi移动到其他地方,您必须重写桥接代码,并且来自OSGi世界,编写OSGi提供的通用功能令人惊讶地庞大。然而,不使用OSGi构造,因为如果应用程序被移植,您必须提供的功能就是浪费金钱


结论:域不应与OSGi混合,桥接代码应充分利用OSGi。

不依赖OSGi的理由是,由于中间件OSGi在代码中的可见性使其内聚性降低。域代码和OSGi代码不应该混合(就像它不应该与JMS、JavaEE或任何其他API混合一样)。内聚性较差的代码更复杂,因此容易出错

然而,您总是需要一些桥接代码来将基础结构链接到域代码。因为这个桥接代码无论如何都要耦合到一些API,所以充分利用它,从桥接代码的环境中抽象自己是绝对没有用的

DS(和Blueprint、iPOJO等)为业务逻辑隐藏注册表,它们只是提供域注册表的非常方便的方法。因此,使用OSGi,如果域对象本身不知道OSGi,您几乎不需要编写任何代码就可以拥有非常强大的域对象存储库

是的,如果您将代码从OSGi移动到其他地方,您必须重写桥接代码,并且来自OSGi世界,编写OSGi提供的通用功能令人惊讶地庞大。然而,不使用OSGi构造,因为如果应用程序被移植,您必须提供的功能就是浪费金钱<