zoukankan      html  css  js  c++  java
  • Provicer Pattern In ASP.NET Core

    using System;
    using System.Collections.Generic;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.DependencyInjection.Extensions;
    using Microsoft.Extensions.Hosting;
    
    namespace Default
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(builder =>
                    {
                        builder.ConfigureServices((ctx, svcs) =>
                        {
                            svcs.AddDefault();
                            svcs.AddTransient<IHandler, FooHandler>();
                        }).Configure((ctx, app) =>
                        {
                            app.UseRouting();
                            app.UseEndpoints(endpoints =>
                            {
                                endpoints.MapGet("/", async context =>
                                {
                                    context.RequestServices.GetRequiredService<IService>().Execute();
                                    await context.Response.WriteAsync("Done");
                                });
                            });
                        });
                    })
                    .Build()
                    .Run();
            }
        }
        public interface IHandler
        {
            void Handle();
        }
        public class DefaultHandler : IHandler
        {
            public void Handle()
            {
                Console.WriteLine("DefaultHandler.Handle");
            }
        }
        public interface IHandlerProvider
        {
            IEnumerable<IHandler> GetHandlers();
        }
        public class DefaultHandlerProvider : IHandlerProvider
        {
            private readonly IEnumerable<IHandler> _handlers;
            public DefaultHandlerProvider(IEnumerable<IHandler> handlers)
            {
                _handlers = handlers;
            }
            public IEnumerable<IHandler> GetHandlers()
            {
                return _handlers;
            }
        }
        public interface IService
        {
            void Execute();
        }
        public class DefaultService : IService
        {
            private readonly IHandlerProvider _handlerProvider;
            public DefaultService(IHandlerProvider handlerProvider)
            {
                _handlerProvider = handlerProvider;
            }
            public void Execute()
            {
                var handlers = _handlerProvider.GetHandlers();
                foreach (var handler in handlers)
                {
                    handler.Handle();
                }
            }
        }
        public static class ServiceCollectionExtensions
        {
            public static IServiceCollection AddDefault(this IServiceCollection services)
            {
                services.TryAdd(ServiceDescriptor.Transient<IService, DefaultService>());
                services.TryAdd(ServiceDescriptor.Transient<IHandlerProvider, DefaultHandlerProvider>());
                services.TryAddEnumerable(ServiceDescriptor.Transient<IHandler, DefaultHandler>());
                return services;
            }
        }
        public class FooHandler : IHandler
        {
            public void Handle()
            {
                Console.WriteLine("FooHandler.Handle");
            }
        }
    }
  • 相关阅读:
    [adminitrative][archlinux][setfont] 设置console的字体大小
    [daily][archlinux][rsync] rsync
    [skill][msgpack] 初试msgpack库以及基本使用
    AWS之搭建深度学习主机
    AWS之SSH登录:使用 PuTTY 从 Windows 连接到 Linux 实例
    加拿大大学排名 by USNews
    Python多进程vs多线程
    Python之JSON使用
    Python之模块与包
    Android重打包+重新签名工具Apktool Box
  • 原文地址:https://www.cnblogs.com/xiaowangzhi/p/14067688.html
Copyright © 2011-2022 走看看