zoukankan      html  css  js  c++  java
  • Wpf之Microsoft.Extensions.DependencyInjection

    参考Autofac.Extras.CommonServiceLocator实现ServiceCollectionServiceLocator
    /// <summary>
    /// Implementation of the Microsoft CommonServiceLocator.
    /// </summary>
    public class ServiceCollectionServiceLocator: ServiceLocatorImplBase
    {
        private readonly IServiceProvider services;
    
        public ServiceCollectionServiceLocator(IServiceProvider services)
        {
            this.services = services ?? throw new ArgumentNullException();
        }
    
        protected override object DoGetInstance(Type serviceType, string key)
        {
            if (serviceType == null)
            {
                throw new ArgumentNullException(nameof(serviceType));
            }
    
            return services.GetRequiredService(serviceType);
        }
    
        protected override IEnumerable<object> DoGetAllInstances(Type serviceType)
        {
            if (serviceType == null)
            {
                throw new ArgumentNullException(nameof(serviceType));
            }
    
            var enumerableType = typeof(IEnumerable<>).MakeGenericType(serviceType);
    
            var instance = services.GetServices(enumerableType);
            return ((IEnumerable)instance).Cast<object>();
        }
    }
    
    在Mvvmlight中使用Microsoft.Extensions.DependencyInjection
    public class AppLocator : ViewModelBase
    {
        public IConfiguration Configuration { get; private set; }
    
        public AppLocator()
        {
            #region Microsoft.Extensions.DependencyInjection
            Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", false, true)
                .Build();
    
            var provider = new ServiceCollectionServiceLocator(Configure());
            ServiceLocator.SetLocatorProvider(() => provider);
            #endregion
    
            #region AutoFac
            // Set the service locator to an AutofacServiceLocator.
            //var provider = new AutofacServiceLocator(Configure());
            //ServiceLocator.SetLocatorProvider(() => provider);
            #endregion
    
            #region gRpc
            try
            {
                var server = new Server()
                {
                    Services = {
                    Greeter.BindService(ServiceLocator.Current.GetInstance<GreeterService>()),
                    Categories.BindService(ServiceLocator.Current.GetInstance<CategoryService>()),
                    MovieRpc.BindService(ServiceLocator.Current.GetInstance<MovieService>())},
                    Ports = { new ServerPort("192.168.31.37", 19840, ServerCredentials.Insecure) }
                };
                server.Start();
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message);
                MessageBox.Show("程序执行遇到错误.
    详情请查看日志信息.", "gRpc",
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
            #endregion
        }
    
        private IServiceProvider Configure()
        {
            var container = new ServiceCollection();
    
            // Configuration
            container.Configure<AppSettings>(Configuration.GetSection(nameof(AppSettings)));
    
            // Service
            container.AddDbContext<MyContext>(options =>
                {
                    options.UseSqlite("Data Source=stk.db3");
                    options.UseLoggerFactory(LoggerFactory.Create(builder =>
                    {
                        builder.AddFilter((category, level) =>
                            category == DbLoggerCategory.Database.Command.Name
                            && level == LogLevel.Information);
                        builder.AddConsole();
                    }));
                });
            container.AddSingleton<GreeterService>();
            container.AddSingleton<CategoryService>();
            container.AddSingleton<MovieService>();
            container.AddSingleton<StereoscopicPlayer>();
            container.AddSingleton(new MotionService(100, 5, 10000));
    
            // VM
            container.AddSingleton<MainViewModel>();
            container.AddSingleton<CategoryViewModel>();
            container.AddSingleton<MovieViewModel>();
            container.AddSingleton<PlayTestViewModel>();
            container.AddSingleton<PlayRecordViewModel>();
            container.AddSingleton(new LogViewModel());
            container.AddSingleton<PlatformTestViewModel>();
    
            // Perform registrations and build the container.
            return container.BuildServiceProvider();
        }
    
        #region AutoFac Configure
        //private IContainer Configure()
        //{
        //    var builder = new ContainerBuilder();
        //    if (IsInDesignModeStatic)
        //    {
    
        //    }
        //    else
        //    {
        //        // Service
        //        builder.RegisterType<MyContext>();
        //        builder.RegisterType<GreeterService>();
        //        builder.RegisterType<CategoryService>();
        //        builder.RegisterType<MovieService>();
        //        builder.RegisterType<StereoscopicPlayer>().SingleInstance();
        //        builder.RegisterInstance(new MotionService(100, 5, 10000)).SingleInstance();
    
        //        // Settings
        //        builder.RegisterInstance(Configuration.GetSection(nameof(AppSettings))).SingleInstance();
    
        //        // VM
        //        builder.RegisterType<MainViewModel>().SingleInstance();
        //        builder.RegisterType<CategoryViewModel>().SingleInstance();
        //        builder.RegisterType<MovieViewModel>().SingleInstance();
        //        builder.RegisterType<PlayTestViewModel>().SingleInstance();
        //        builder.RegisterType<PlayRecordViewModel>().SingleInstance();
        //        builder.RegisterInstance(new LogViewModel()).SingleInstance();
        //        builder.RegisterType<PlatformTestViewModel>().SingleInstance();
        //    }
    
        //    // Perform registrations and build the container.
        //    return builder.Build();
        //} 
        #endregion
    
        // Resolve VM
        public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>();
        public CategoryViewModel Category => ServiceLocator.Current.GetInstance<CategoryViewModel>();
        public MovieViewModel Movie => ServiceLocator.Current.GetInstance<MovieViewModel>();
        public PlayTestViewModel PlayTest => ServiceLocator.Current.GetInstance<PlayTestViewModel>();
        public PlayRecordViewModel PlayRecord => ServiceLocator.Current.GetInstance<PlayRecordViewModel>();
        public LogViewModel Log => ServiceLocator.Current.GetInstance<LogViewModel>();
        public PlatformTestViewModel PlatformTest => ServiceLocator.Current.GetInstance<PlatformTestViewModel>();
    
        public override void Cleanup()
        {
            // TODO Clear the ViewModels
        }
    }
    
    使用 HttpClientFactory
    ...
    container.AddHttpClient();
    ...
    var client = _httpClientFactory.CreateClient();
    var html = await client.GetStringAsync("http://www.baidu.com");
    
    参考资料

    https://www.cnblogs.com/hippieZhou/p/10637348.html
    https://www.cnblogs.com/ryzen/p/12444366.html#4538407

  • 相关阅读:
    访客登录方案设计与应用
    VS Code下载
    dockerfile COPY命令失效
    mysql排序字段值相等时,分页数据重复
    go使用json包Marshal方法得到异常结果[123 125]
    Mysql知识点概览
    dockercompose安装
    docker安装
    Shell脚本执行报错:Syntax error: "(" unexpected
    二进制数的位运算,角色权限,多种账号来源
  • 原文地址:https://www.cnblogs.com/linxmouse/p/12751085.html
Copyright © 2011-2022 走看看