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");
            }
        }
    }
  • 相关阅读:
    设置页面标题title
    路由跳转,页面位置不在顶部
    PyTorch深度学习入门
    删除ubuntu后开机进入grub的解决办法
    研一上英语
    python中常用的几个函数的正确用法-lambda/filter/map/reduce
    【Python教程】 re 模块中findall() 函数返回值展现方式的用法详解
    【Python教程】5种常见字符串去除空格的操作方法
    对python中浅拷贝和深拷贝分析详细介绍
    Git使用
  • 原文地址:https://www.cnblogs.com/xiaowangzhi/p/14067688.html
Copyright © 2011-2022 走看看