## Dependency Module
The DI module uses [Guice](https://github.com/google/guice/wiki/) as a dependency injection container of the SDK. 
All service interfaces that are 

### Service Binding

All Services are bound to their implementations within the ```configure()``` method of the ```SdkModule```.
New Implementations or Providers can be added here  can be registered here.

```java

  @Override
    protected void configure() {

        bindConfigProperties();

        bind(CryptoService.class).to(JWECryptoService.class);
        bind(CertificateValidator.class).to(KeyValidator.class);
        bind(MetadataValidator.class).to(MetadataSubmissionValidator.class);
        bind(MetadataService.class).to(MetadataUploadService.class);

        bind(Sender.class).to(SubmissionSender.class);
        bind(Subscriber.class).to(SubmissionSubscriber.class);
    }
```

The actual injection can be done in three ways via @Inject:
* Parameter Injection 
* Constructor Injection
* Getting the Service directly from the DI Container


### Application Properties
The sdk can be externally configured via set property keys in ``sdk-config/sdk.properties``. Those are keys are loaded 
on the guice initialization and can be accessed via the ``@Named`` Annotation. See [Guice](https://github.com/google/guice/wiki/) 
for further information on the usage.