2008/03/22

[HiveMind] How to share the same implementation or instance between different service interfaces

HiveMind is a great DI/IoC framework, why there is no anymore developements?

Anyway, the question is different from The ability to specify multiple interfaces of a service, but it is suitable when customization is required.

Assumed that interface package.ExtendedService extends package.GeneralService, if you want service GeneralService and ExtendedService to share the same implementation (or instance), you can create a service factory called DelegateFactory:

DelegateFactory declaration:

<service-point id="DelegateFactory" interface="org.apache.hivemind.ServiceImplementationFactory">
<parameters-schema>
<element name="delegate">
<attribute name="service-id" required="true" translator="service" />
<rules>
<create-object class="package.hivemind.impl.DelegateParameters" />
<read-attribute attribute="service-id" property="delegate" />
<invoke-parent method="addElement" />
</rules>
</element>
</parameters-schema>
<create-instance class="package.hivemind.impl.DelegateFactory" model="primitive" />
</service-point>


DelegateFactory source:

package package.hivemind.impl;

import org.apache.hivemind.ServiceImplementationFactory;
import org.apache.hivemind.ServiceImplementationFactoryParameters;

public class DelegateFactory implements ServiceImplementationFactory {

@Override
public Object createCoreServiceImplementation(ServiceImplementationFactoryParameters factoryParameters) {
DelegateParameters parameters = (DelegateParameters)factoryParameters.getFirstParameter();
return parameters.getDelegate();
}

}


DelegateParameters source

package package.hivemind.impl;

public class DelegateParameters {

private Object delegate;

public Object getDelegate() {
return delegate;
}

public void setDelegate(Object delegate) {
this.delegate = delegate;
}

}


After that, we can simply use DelegateFactory to delegate all requests for GeneralService service to ExtendedService service, share the same implementation or instance.

Usage:

<service-point id="GeneralService" interface="package.GeneralService">
<invoke-factory service-id="DelegateFactory">
<delegate service-id="ExtendedService" />
</invoke-factory>
</service-point>

<service-point id="ExtendedService" interface="package.ExtendedService">
<invoke-factory>
<!-- where ExtendedServiceImpl extends GeneralServiceImpl -->
<construct class="package.ExtendedServiceImpl" />
</invoke-factory>
</service-point>