Link 使用 OSGI 的不同提供者和消费者对一个消费者
Link different providers and consumers to one consumer using OSGI
我正在尝试使用 OSGI framewrok 构建一个天气应用程序。我创建了一个带有消费者和提供者的国家查找器,以及一个带有消费者和提供者的城市查找器,最后是天气提供者和消费者。
- 在国家/地区消费者中,我允许用户检查某个国家/地区是否可以查看天气。
- 在城市消费者中,我允许用户检查城市是否可用于检查城市提供者中的天气,我使用哈希图国家/地区作为键,城市作为值。
- 在执行消费者后的天气包中,我希望用户能够输入一个城市,并且应该使用上面创建的国家包检查国家,如果有国家,接下来用户应该是要求输入城市,应使用城市包检查城市,如果存在这样的城市,最后天气提供者应使用该城市并提供天气详细信息。
我无法理解如何将天气包link 到国家和城市包
捆绑包之间连接的常用方法是 OSGi 服务。您可以使用接口或 class 发布服务。然后消费者可以绑定到接口或 class。
在最低级别上,这可以使用 OSGi API 来完成,但不建议直接使用它。
相反,我建议使用带有注释的声明式服务。
See the OSGi enroute microservice example.
它显示了内部连接以及使用和提供 REST 服务。
我认为关键的洞察力是凝聚力。在您的描述中,您混合了 应用程序 的非常不同的方面。 IE。您将用户交互(我想要用户 ..)与查找特定信息的低级机械细节混合在一起。
OSGi 的基本思想是将这些部分分成 服务 。该服务提供了一个低级的 function,它是高度内聚的。 IE。它做 一件 事,而且只有一件事。如果您查看 Event Admin 服务,您会发现它确实发布和订阅。这个想法是你最终会得到不同的服务,这些服务只做一件事并且与任何其他服务没有关系(或耦合)。这种策略允许它们在许多不同的应用程序中重复使用。当您降低内聚性时,您会发现它们变得更难在其他应用程序中重用。这听起来比实际更容易,通常需要一些迭代才能获得真正有凝聚力的服务。
组件是可以提供服务的OSGi事物。通常,组件会消耗其他服务。在您的示例中,您可以拥有一个包含城市的数据库。为了保持组件的内聚性,它不应该直接操作数据库,而是使用服务。您的组件应该是 专家 只在城市,但对数据库的东西一无所知。每当您编写一个组件并且意识到您正在编写与城市无关的代码时,请将其委托给另一个服务。还要确保您的数据库服务对城市一无所知,它只知道数据库。城市组件有一个很好的简单方法,可以从对城市一无所知的组件访问其城市。
如果你这样想,你最终会得到很多什么都不做的服务。您需要在某个地方协调这些服务。这是 应用程序 。应用程序负责整体功能。它的目的是将所有松散的末端绑在一起。在您的例子中,它会消耗城市、天气和其他服务。它还将与用户交互。要与用户交互,它需要能够搜索城市。所以像这样的服务接口会很有用:
public interface Geo {
List<String> countries();
List<String> cities(String country);
Country city(String country);
City city(String city);
}
我正在合并您的城市和国家/地区查找器,因为我发现它们非常有凝聚力。分解它们会增加复杂性。该服务允许我在用户界面上创建一个带有国家/地区的弹出窗口,并且从 selected 国家/地区,我可以 select 一个城市。
接下来是天气服务:
public interface Weather {
boolean hasWeather( String country, String city);
Report getShortReport(String country, String city);
}
select输入国家和城市后,我可以向气象服务部门索取报告。
我在这些接口中使用字符串的原因是为了防止地理服务和天气服务之间的耦合。这是我经常看到的主要菜鸟错误之一。创建城市和国家类型,然后在所有地方使用(或更糟,CityKey),有效地使系统再次成为一个 big ball of mud,其中一切都通过一些 类 与其他一切联系在一起,只是作为一个字符串。
所以现在应用程序组件可以选择一个 GUI(HTML、gogo、Swing、SWT 等)它可以有效地集中在 GUI 上,底层细节由服务处理提供商。应用程序通常应该是系统中唯一不可被任何人重复使用的组件。如果是,将其拆分为可重用部分和特定部分。由于此组件不可重用,因此它是您软件中唯一不必关心耦合的地方。
总结。这个想法是,如果您查看 OGSi 应用程序的服务图,它应该 crystal 清楚事情发生的地方,并且应用程序组件(通常不是服务本身)将它们联系在一起。
希望对您有所帮助。
我正在尝试使用 OSGI framewrok 构建一个天气应用程序。我创建了一个带有消费者和提供者的国家查找器,以及一个带有消费者和提供者的城市查找器,最后是天气提供者和消费者。
- 在国家/地区消费者中,我允许用户检查某个国家/地区是否可以查看天气。
- 在城市消费者中,我允许用户检查城市是否可用于检查城市提供者中的天气,我使用哈希图国家/地区作为键,城市作为值。
- 在执行消费者后的天气包中,我希望用户能够输入一个城市,并且应该使用上面创建的国家包检查国家,如果有国家,接下来用户应该是要求输入城市,应使用城市包检查城市,如果存在这样的城市,最后天气提供者应使用该城市并提供天气详细信息。
我无法理解如何将天气包link 到国家和城市包
捆绑包之间连接的常用方法是 OSGi 服务。您可以使用接口或 class 发布服务。然后消费者可以绑定到接口或 class。 在最低级别上,这可以使用 OSGi API 来完成,但不建议直接使用它。 相反,我建议使用带有注释的声明式服务。
See the OSGi enroute microservice example.
它显示了内部连接以及使用和提供 REST 服务。
我认为关键的洞察力是凝聚力。在您的描述中,您混合了 应用程序 的非常不同的方面。 IE。您将用户交互(我想要用户 ..)与查找特定信息的低级机械细节混合在一起。
OSGi 的基本思想是将这些部分分成 服务 。该服务提供了一个低级的 function,它是高度内聚的。 IE。它做 一件 事,而且只有一件事。如果您查看 Event Admin 服务,您会发现它确实发布和订阅。这个想法是你最终会得到不同的服务,这些服务只做一件事并且与任何其他服务没有关系(或耦合)。这种策略允许它们在许多不同的应用程序中重复使用。当您降低内聚性时,您会发现它们变得更难在其他应用程序中重用。这听起来比实际更容易,通常需要一些迭代才能获得真正有凝聚力的服务。
组件是可以提供服务的OSGi事物。通常,组件会消耗其他服务。在您的示例中,您可以拥有一个包含城市的数据库。为了保持组件的内聚性,它不应该直接操作数据库,而是使用服务。您的组件应该是 专家 只在城市,但对数据库的东西一无所知。每当您编写一个组件并且意识到您正在编写与城市无关的代码时,请将其委托给另一个服务。还要确保您的数据库服务对城市一无所知,它只知道数据库。城市组件有一个很好的简单方法,可以从对城市一无所知的组件访问其城市。
如果你这样想,你最终会得到很多什么都不做的服务。您需要在某个地方协调这些服务。这是 应用程序 。应用程序负责整体功能。它的目的是将所有松散的末端绑在一起。在您的例子中,它会消耗城市、天气和其他服务。它还将与用户交互。要与用户交互,它需要能够搜索城市。所以像这样的服务接口会很有用:
public interface Geo {
List<String> countries();
List<String> cities(String country);
Country city(String country);
City city(String city);
}
我正在合并您的城市和国家/地区查找器,因为我发现它们非常有凝聚力。分解它们会增加复杂性。该服务允许我在用户界面上创建一个带有国家/地区的弹出窗口,并且从 selected 国家/地区,我可以 select 一个城市。
接下来是天气服务:
public interface Weather {
boolean hasWeather( String country, String city);
Report getShortReport(String country, String city);
}
select输入国家和城市后,我可以向气象服务部门索取报告。
我在这些接口中使用字符串的原因是为了防止地理服务和天气服务之间的耦合。这是我经常看到的主要菜鸟错误之一。创建城市和国家类型,然后在所有地方使用(或更糟,CityKey),有效地使系统再次成为一个 big ball of mud,其中一切都通过一些 类 与其他一切联系在一起,只是作为一个字符串。
所以现在应用程序组件可以选择一个 GUI(HTML、gogo、Swing、SWT 等)它可以有效地集中在 GUI 上,底层细节由服务处理提供商。应用程序通常应该是系统中唯一不可被任何人重复使用的组件。如果是,将其拆分为可重用部分和特定部分。由于此组件不可重用,因此它是您软件中唯一不必关心耦合的地方。
总结。这个想法是,如果您查看 OGSi 应用程序的服务图,它应该 crystal 清楚事情发生的地方,并且应用程序组件(通常不是服务本身)将它们联系在一起。
希望对您有所帮助。