Voglio creare un .jar
che incapsula un API del fornitore, quindi possiamo usare i nostri oggetti come parametri per comunicare con l'API.
Ho letto alcuni articoli e argomenti qui in SO, ma sono ancora un po 'confuso se ottengo l'iniezione di dipendenza giusta. Per esempi di House
oggetti con Doors
e Windows
, è facile da capire, ma sembra che diventi difficile con il codice reale.
Non volevo utilizzare alcun modello framework / locator. Il seguente codice è solo una semplificazione di come gli oggetti sono effettivamente. L'oggetto Cake è un oggetto grande e così via:)
Questo codice è valido? Dovrei cambiarlo per essere più facile da testare?
//These are the third-party classes
class VendorService {
public VendorService(String wsdlPath) {/*vendor code*/}
ICakeApi getApi();
}
interface ICakeApi {
void authenticate(String username, String password);
VendorSpecificCake cookCake(VendorSpecificIngredients ingredients);
}
//This is the code I'm trying to use DI
class MyCakeService {
ICakeApi cakeApi;
public MyCakeService(ICakeApi cakeApi) {
this.cakeApi = cakeApi;
}
public void authenticate(MyUserPasswordBean bean) {
cakeApi.authenticate(bean.getUsername(), bean.getPassword());
}
MySpecificCake cookCake(MySpecificIngredients ingredients,
VendorObjectFactory vendorFactory,
InternalObjectFactory internalFactory) {
VendorSpecificIngredients objs =
vendorFactory.createVendorSpecificIngredients(ingredients);
VendorSpecificCake vCake = cakeApi.cookCake(objs);
MySpecificCake myCake = internalFactory.createMySpecificCake(vCake);
return myCake;
}
}
class MyCakeServiceFactory {
MyCakeService build(String wsdlPath) {
VendorService vendorService = new VendorService(wsdlPath);
ICakeApi cakeApi = vendorService.getApi();
MyCakeService service = new MyCakeService(cakeApi);
}
}
class UsageTest {
public void testMyCode() {
MyCakeServiceFactory factory = new MyCakeServiceFactory();
//should I add this as dependency on the constructor?
VendorObjectFactory vendorFactory = new VendorObjectFactory();
InternalObjectFactory internalFactory = new InternalObjectFactor();
MyCakeService service = factory.build("/tmp");
service.authenticate(new MyUserPasswordBean("john", "snow"));
MySpecificIngredients ingr = new MySpecificIngredients(...);
//ideally, I'd like to avoid having the user to instantiate
//VendorObjectFactory and InternalObjectFactory
service.cookCake(ingr, vendorFactory, internalFactory);
}
}