Skip to content

DI binding

Universal binding mechanism: suppose we have Provider<T> instances and want to bind them (in DI container like guice):

Provider providerInstance = ...;

Class type = GenericsResolver.resolve(providerInstance.getClass())
        .type(Provider.class)
        .generic(0);

bind(type).toProvider(providerInstance);

For example, for instance of class MyProvider implements Provider<MyType> binding will be bind(MyType.class),toProvider(MyProviderInstance)

Note

Guice binding syntax used, just an example to get overall idea.

Warning

This will work only if generic was decled for provider class because otherwise generic would be resolved as Object (if generic not declared - nowhere to get type information)

Universal mechanism (for any type)

And here is an example of universal binding mechanism (pseudo DI):

public void bindExtension(Class extensionType, Class contractType) {    
    // actual generics of required extension
    Type[] generics = GenericsResolver.resolve(extensionType)
                                  .type(contractType)
                                  .genericTypes()
                                  .toArray(new Type[0]);
    // actual extension type (specific to provided instance)
    Type bindingType = generics.length > 0 
                    ? new ParameterizedTypeImpl(contractType, generics)
                    : contractType;

    bind(bindingType).to(extensionObjectType)
}

For example, if we have extension class MyExtension implements Useful<String> we can bind it with correct generics bindExtension(MyExtension.class, Useful.class) which perform bind(Useful<String>).to(MyExtension.class).