如何正确使用 ExtensionManager 和 ExtensionHandler 实现 类
How to properly use ExtensionManager and ExtensionHandler implementing classes
Broadleaf 使用 ExtensionManager class 实现 InvocationHandler 来扩展功能(通过 extensionHandlers)并提供某种挂钩(例如,首先尝试调用 extensionManager 方法,如果未处理则正常进行) 来改变框架 classes 行为而不需要扩展它们和覆盖方法。
我的第一个问题是,如果多态性是解决这个问题的整个范例,那么这种方法背后的动机是什么?有什么好处?
其次,如果我要使用它,正确的方法是什么?
例如,我尝试扩展 AbstractInventoryServiceExtensionHandler 并覆盖方法(因为 broadleaf 5.0.1 在 InventoryServiceImpl 中有一个关于 CHECK_QUANTITY retrieveQuantitiesAvailable 方法中的 InventoryType 的错误)
接下来我扩展了 InventoryServiceExtensionManager 并尝试使用覆盖的方法注册该 extensionHandler
在调用相关方法时 - 我在 extensionManager 上调用 getProxy() 方法时出错,说 ClassCastException from Proxy.toString() 并且处理程序列表是空的虽然我注册了处理程序?
最后我简单地扩展了 InventoryServiceImpl 并修正了错误,这解决了我的问题,但给我留下了上述问题。
My first question is what is motivation behind this aproach if polymorfism is whole paradigm addressing this problem? What are benefits ?
这允许 Broadleaf 生态系统中的多个 "modules"(插件)在运行时(通过注册它们自己)而不是在编译时修改行为。这是一个松散的耦合。此外,如果您需要多次修改代码中的同一位置(此时您需要多重继承)
Secondly if I'm going to use it what is correct way to do that?
根据您所说的,您永远不需要扩展扩展 manager,而只需扩展 handler。然后处理程序应该向管理器注册自己。这是一个例子:
@Component
public class MyInventoryExtensionHandler extends AbstractInventoryServiceExtensionHandler {
@Resource
protected InventoryServiceExtensionManager extensionManager;
@PostConstruct
public void init() {
extensionManager.registerHandler(this);
}
@Override
public ExtensionResultStatusType retrieveQuantitiesAvailable(Collection<Sku> skus, Map<String, Object> context, ExtensionResultHolder<Map<Sku, Integer>> result) {
...
...
return ExtensionResultStatusType.HANDLED;
}
}
For example I tried to extend AbstractInventoryServiceExtensionHandler and override methods (because broadleaf 5.0.1 has a bug in InventoryServiceImpl regarding CHECK_QUANTITY InventoryType in retrieveQuantitiesAvailable method)
错误是什么?
Broadleaf 使用 ExtensionManager class 实现 InvocationHandler 来扩展功能(通过 extensionHandlers)并提供某种挂钩(例如,首先尝试调用 extensionManager 方法,如果未处理则正常进行) 来改变框架 classes 行为而不需要扩展它们和覆盖方法。
我的第一个问题是,如果多态性是解决这个问题的整个范例,那么这种方法背后的动机是什么?有什么好处?
其次,如果我要使用它,正确的方法是什么?
例如,我尝试扩展 AbstractInventoryServiceExtensionHandler 并覆盖方法(因为 broadleaf 5.0.1 在 InventoryServiceImpl 中有一个关于 CHECK_QUANTITY retrieveQuantitiesAvailable 方法中的 InventoryType 的错误)
接下来我扩展了 InventoryServiceExtensionManager 并尝试使用覆盖的方法注册该 extensionHandler
在调用相关方法时 - 我在 extensionManager 上调用 getProxy() 方法时出错,说 ClassCastException from Proxy.toString() 并且处理程序列表是空的虽然我注册了处理程序?
最后我简单地扩展了 InventoryServiceImpl 并修正了错误,这解决了我的问题,但给我留下了上述问题。
My first question is what is motivation behind this aproach if polymorfism is whole paradigm addressing this problem? What are benefits ?
这允许 Broadleaf 生态系统中的多个 "modules"(插件)在运行时(通过注册它们自己)而不是在编译时修改行为。这是一个松散的耦合。此外,如果您需要多次修改代码中的同一位置(此时您需要多重继承)
Secondly if I'm going to use it what is correct way to do that?
根据您所说的,您永远不需要扩展扩展 manager,而只需扩展 handler。然后处理程序应该向管理器注册自己。这是一个例子:
@Component
public class MyInventoryExtensionHandler extends AbstractInventoryServiceExtensionHandler {
@Resource
protected InventoryServiceExtensionManager extensionManager;
@PostConstruct
public void init() {
extensionManager.registerHandler(this);
}
@Override
public ExtensionResultStatusType retrieveQuantitiesAvailable(Collection<Sku> skus, Map<String, Object> context, ExtensionResultHolder<Map<Sku, Integer>> result) {
...
...
return ExtensionResultStatusType.HANDLED;
}
}
For example I tried to extend AbstractInventoryServiceExtensionHandler and override methods (because broadleaf 5.0.1 has a bug in InventoryServiceImpl regarding CHECK_QUANTITY InventoryType in retrieveQuantitiesAvailable method)
错误是什么?