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");
            }
        }
    }
  • 相关阅读:
    树链剖分
    NOI2015 软件包管理器(树链剖分+线段树)
    9.11NOIP模拟题
    9.10NOIP模拟题
    bzoj1121[POI2008]激光发射器SZK(结论)
    9.9 NOIP模拟题
    树形dp
    P1272 重建道路(树形dp)
    Codeforces Round #419 (Div. 2)
    9.2NOIP模拟题
  • 原文地址:https://www.cnblogs.com/xiaowangzhi/p/14067688.html
Copyright © 2011-2022 走看看