using Autofac; using Microsoft.Extensions.DependencyInjection; using Stylet; using System; using System.Collections.Generic; using System.Reflection; namespace Bootstrappers { public class MicrosoftDependencyInjectionBootstrapper : BootstrapperBase where TRootViewModel : class { private ServiceProvider serviceProvider; private TRootViewModel _rootViewModel; protected virtual TRootViewModel RootViewModel { get { return this._rootViewModel ?? (this._rootViewModel = (TRootViewModel)this.GetInstance(typeof(TRootViewModel))); } } public IServiceProvider ServiceProvider { get { return this.serviceProvider; } } protected override void ConfigureBootstrapper() { var services = new ServiceCollection(); this.DefaultConfigureIoC(services); this.ConfigureIoC(services); this.serviceProvider = services.BuildServiceProvider(); } /// /// Carries out default configuration of the IoC container. Override if you don't want to do this /// protected virtual void DefaultConfigureIoC(IServiceCollection services) { var viewManagerConfig = new ViewManagerConfig() { ViewFactory = this.GetInstance, ViewAssemblies = new List() { this.GetType().Assembly } }; services.AddSingleton(new ViewManager(viewManagerConfig)); services.AddTransient(); services.AddSingleton(this); services.AddSingleton(); services.AddSingleton(); services.AddTransient(); // Not singleton! // Also need a factory services.AddSingleton>(() => new MessageBoxViewModel()); } /// /// Override to add your own types to the IoC container. /// protected virtual void ConfigureIoC(IServiceCollection services) { } public override object GetInstance(Type type) { return this.serviceProvider.GetRequiredService(type); } protected override void Launch() { base.DisplayRootView(this.RootViewModel); } public override void Dispose() { base.Dispose(); ScreenExtensions.TryDispose(this._rootViewModel); if (this.serviceProvider != null) this.serviceProvider.Dispose(); } } }