/// <summary> /// Setup custom rules overriding autowired ones, for example in cases /// where an interface has multiple implementations, and cases where /// a singleton is preferred to new instances. /// </summary> private static void SetupCustomRules(ContainerBuilder builder) { // Make sure the configuration is read only once. IConfig config = new Config(new ConfigData(new Logger(Uptime.ProcessId))); builder.RegisterInstance(config).As <IConfig>().SingleInstance(); // Service configuration is generated by the entry point, so we // prepare the instance here. builder.RegisterInstance(config.LoggingConfig).As <ILoggingConfig>().SingleInstance(); builder.RegisterInstance(config.ServicesConfig).As <IServicesConfig>().SingleInstance(); builder.RegisterInstance(config.BlobStorageConfig).As <IBlobStorageConfig>().SingleInstance(); // Instantiate only one logger var logger = new Logger(Uptime.ProcessId, config.LoggingConfig); builder.RegisterInstance(logger).As <ILogger>().SingleInstance(); var threadWrapper = new ThreadWrapper(); // Auth and CORS setup Auth.Startup.SetupDependencies(builder, config); // By default the DI container create new objects when injecting // dependencies. To improve performance we reuse some instances, // for example to reuse IoT Hub connections, as opposed to creating // a new connection every time. //builder.RegisterType<Foo>().As<IFoo>().SingleInstance(); ICloudStorageWrapper cloudStorageWrapper = new CloudStoragWrapper(); IBlobStorageHelper blobStorageHelper = new BlobStorageHelper(config.BlobStorageConfig, cloudStorageWrapper, logger); IFileWrapper fileWrapper = new FileWrapper(); IDeviceGroupsWriter deviceGroupsWriter = new DeviceGroupsWriter(config.BlobStorageConfig, blobStorageHelper, fileWrapper, logger); builder.RegisterInstance(deviceGroupsWriter).As <IDeviceGroupsWriter>().SingleInstance(); IHttpClient httpClient = new HttpClient(logger); IDevicesClient devicesClient = new DevicesClient(httpClient, config.ServicesConfig, logger); builder.RegisterInstance(devicesClient).As <IDevicesClient>().SingleInstance(); IDeviceGroupsClient deviceGroupsClient = new DeviceGroupsClient( httpClient, devicesClient, config.ServicesConfig, logger, threadWrapper); builder.RegisterInstance(deviceGroupsClient).As <IDeviceGroupsClient>().SingleInstance(); // Event Hub Classes IEventProcessorHostWrapper eventProcessorHostWrapper = new EventProcessorHostWrapper(); builder.RegisterInstance(eventProcessorHostWrapper).As <IEventProcessorHostWrapper>().SingleInstance(); IEventHubStatus eventHubStatus = new EventHubStatus(); builder.RegisterInstance(eventHubStatus).As <IEventHubStatus>().SingleInstance(); IEventProcessorFactory eventProcessorFactory = new DeviceEventProcessorFactory(eventHubStatus, config.ServicesConfig, logger); builder.RegisterInstance(eventProcessorFactory).As <IEventProcessorFactory>().SingleInstance(); }
/// <summary>Setup Custom rules overriding autowired ones.</summary> private static void SetupCustomRules(ContainerBuilder builder) { // Make sure the configuration is read only once. IConfig config = new Config(new ConfigData(new Logger(Uptime.ProcessId, LogLevel.Info))); builder.RegisterInstance(config).As <IConfig>().SingleInstance(); // Service configuration is generated by the entry point, so we // prepare the instance here. builder.RegisterInstance(config.ServicesConfig).As <IServicesConfig>().SingleInstance(); // Instantiate only one logger // TODO: read log level from configuration var logger = new Logger(Uptime.ProcessId, LogLevel.Debug); builder.RegisterInstance(logger).As <ILogger>().SingleInstance(); // Set up storage client for Cosmos DB var storageClient = new StorageClient(config.ServicesConfig, logger); builder.RegisterInstance(storageClient).As <IStorageClient>().SingleInstance(); // Set up BLOB storage client ICloudStorageWrapper cloudStorageWrapper = new CloudStoragWrapper(); IBlobStorageHelper blobStorageHelper = new BlobStorageHelper(config.BlobStorageConfig, cloudStorageWrapper, logger); builder.RegisterInstance(blobStorageHelper).As <IBlobStorageHelper>().SingleInstance(); // Http IHttpClient httpClient = new HttpClient(logger); builder.RegisterInstance(httpClient).As <IHttpClient>(); // Setup Time Series Insights Client var timeSeriesClient = new TimeSeriesClient(httpClient, config.ServicesConfig, logger); builder.RegisterInstance(timeSeriesClient).As <ITimeSeriesClient>().SingleInstance(); // Auth and CORS setup Auth.Startup.SetupDependencies(builder, config); // By default Autofac uses a request lifetime, creating new objects // for each request, which is good to reduce the risk of memory // leaks, but not so good for the overall performance. //builder.RegisterType<CLASS_NAME>().As<INTERFACE_NAME>().SingleInstance(); builder.RegisterType <UserManagementClient>().As <IUserManagementClient>().SingleInstance(); builder.RegisterType <DiagnosticsClient>().As <IDiagnosticsClient>().SingleInstance(); // Event Hub Classes IEventProcessorHostWrapper eventProcessorHostWrapper = new EventProcessorHostWrapper(); builder.RegisterInstance(eventProcessorHostWrapper).As <IEventProcessorHostWrapper>().SingleInstance(); IEventProcessorFactory eventProcessorFactory = new ActionsEventProcessorFactory(logger, config.ServicesConfig, httpClient); builder.RegisterInstance(eventProcessorFactory).As <IEventProcessorFactory>().SingleInstance(); }