当前位置: 首页 > news >正文

湖州 网站建设公司哪家好东莞市行政区划图

湖州 网站建设公司哪家好,东莞市行政区划图,网站首页图片代码,网页布局排版技巧构造模式 构造器的目的和构造函数一样#xff0c;但是构造器可以提供丰富的api来简化对象的构造 构造模式用于简化被构造对象的创建#xff0c;通过提供一大堆的api来丰富简化构造过程#xff0c;增加调用者的体验。 构造者需要提供一个Build方法用于构建和返回将要构造的…构造模式 构造器的目的和构造函数一样但是构造器可以提供丰富的api来简化对象的构造 构造模式用于简化被构造对象的创建通过提供一大堆的api来丰富简化构造过程增加调用者的体验。 构造者需要提供一个Build方法用于构建和返回将要构造的对象实列。 在容器中一般需要提供一个公开的IServiceCollection类型的属性用于注册服务。 IServiceCollection是构造者模式 */     public class DbContext     { }     public enum ServiceLifetime     {         Transient,         Scoped,     }     public class ServiceDescriptor     {         public Type ServiceType { get; } public ServiceLifetime Lifetime { get; } public ServiceDescriptor(Type serviceType, ServiceLifetime lifetime)         {             ServiceType serviceType;             Lifetime lifetime;         }     }     //目标对象     public interface IContainer     { }     //如果直接创建成本很高体验很差     public class Container : IContainer     {         private ListServiceDescriptor _services new(); public Container(ListServiceDescriptor services)         {             _services services;         }     }     //目标对象的构造者     public interface IContainerBuilder     {         //接口只提供一个通用方法降低实现成本         void Add(ServiceDescriptor descriptor);         //构造目标对象         IContainer Build();     }     //实现构造者     public class ContainerBuilder : IContainerBuilder     {         private ListServiceDescriptor _services new ListServiceDescriptor (); public void Add(ServiceDescriptor descriptor)         {             _services.Add(descriptor);         } public IContainer Build()         {             return new Container(_services);         }     }     //扩展构造者提供更加便捷的api     public static class IContainerBuilderExtensions     {         public static void AddTransientT(this IContainerBuilder builder)         {             builder.Add(new ServiceDescriptor(typeof(T), ServiceLifetime.Transient));         }         public static void AddScopedT(this IContainerBuilder builder)         {             builder.Add(new ServiceDescriptor(typeof(T), ServiceLifetime.Scoped));         }     } 工厂模式 工厂模式侧重于对象的管理创建销毁一般提供一个Create方法支持命名创建。 通过上面的学习我们发现IOC有一个弊端就是他是通过服务类型的解析服务的。有些情况下我们需要通过命名的方式来解析服务。此时可以使用工厂模式。 IServiceProvider也是工厂模式 public interface IDbConnection { } public class MySqlDbConnection : IDbConnection { } public class SqlDbConnection : IDbConnection { } //如果是一个重量级的工厂建议注册成单实例 public class DbConnectionFactory {       private Dictionarystring, Type _connections; public DbConnectionFactory(Dictionarystring, Type connections)     {         _serviceProvider provider;         _connections connections;     } public IDbConnection? Create(IServiceProvider serviceProvider, string name)     {         if (_connections.TryGetValue(name, out Type? connectionType))         {             return serviceProvider.GetRequiredService(connectionType) as IDbConnection;         }         return default;     } } //测试 var services new ServiceCollection(); services.AddScopedMySqlDbConnection(); services.AddScopedSqlDbConnection(); services.AddSingleton(sp   {     var connections new Dictionarystring, Type     {         { s1, typeof(SqlDbConnection) },         { s2, typeof(MySqlDbConnection) }     };     return new DbConnectionFactory(connections); }); var sp services.BuildServiceProvider(); var factory sp.GetRequiredServiceDbConnectionFactory(); var s1 factory.Create(sp, s1); var s2 factory.Create(sp, s2); 提供模式 如果看到提供者模式说明我们可以提供多个方案支持多实现 一般通过工厂来管理提供者用以支持命名实列 public interface ILogger {     void Info(string message); } public interface ILoggerProvider {     ILogger CreateLogger(string name); } //日志提供方案1 public class ConsoleLoggerProvider : ILoggerProvider {     public ILogger CreateLogger(string name)     {         return new ConsoleLogger(name);     }     class ConsoleLogger : ILogger     {         private string _name;         public ConsoleLogger(string name)         {             _name name;         }         public void Info(string message)         {             Console.WriteLine(${_name}:{message});         }     } } //日志提供方案2 public class DebugLoggerProvider : ILoggerProvider {     public ILogger CreateLogger(string name)     {         return new DebugLogger(name);     } class DebugLogger : ILogger     {         private string _name;         public DebugLogger(string name)         {             _name name;         }         public void Info(string message)         {             Debug.WriteLine(${_name}:{message});         }     } } public class LoggerFactoryBuilder {     private ListILoggerProvider _providers new ();          public void Add(ILoggerProvider provider)     {         _providers.Add(provider);     }          public LoggerFactory Build()     {         return new LoggerFactory(_providers);     } } //这里用到了代理模式工厂模式构造模式提供模式 public class LoggerFactory {     private IEnumerableILoggerProvider _providers new ();          public LoggerFactory(IEnumerableILoggerProvider providers)     {         _providers providers;     }          //通过委托的方式来构造     public static LoggerFactory Create(ActionLoggerFactoryBuilder configure)     {         var builder new LoggerFactoryBuilder();         configure(builder);         return builder.Build();     }          public void AddProvider(ILoggerProvider provider)     {         _providers.Add(provider);     }          public ILogger Create(string name)     {         var loggers _providers.Select(ss.CreateLogger(name));         return new LoggerCollection(loggers);     }     //代理模式     class LoggerCollection : ILogger     {         private IEnumerableILogger _loggers;         public LoggerCollection(IEnumerableILogger loggers)         {             _loggers loggers;         } public void Info(string message)         {             foreach (var logger in _loggers)             {                 logger.Info(message);             }         }     } } 代理模式 代理模式侧重于对目标对象进行加强通过实现目标对象的接口具备目标对象的能力。 一般通过实现和目标对象相同的接口来获得目标对象的能力 代理可以通过目标对象来简化实现成本代理只负责编写加强逻辑 一般代理器只代理单个目标对象我们把下面这个模式也可以归纳到代理模式因为它能满足代理的许多特点比如加强、拥有目标对象的能力 思考我们需要一个LoggerCollection需要实现ICollectionILogger接口如何降低实现成本 public interface ILogger {void Info(string message); } //代理模式必须要实现和目标相同的接口并且可以注入目标对象 public class LoggerCollection : ILogger {private IEnumerableILogger _loggers;public LoggerCollection(IEnumerableILogger loggers){_loggers loggers;} ​public void Info(string message){   //加强逻辑foreach (var logger in _loggers){//具体实现由目标对象实现logger.Info(message);}} } ​ 装饰者模式 装饰者模式侧重于添加装饰方法装饰者模式在Stream里面使用非常频繁我们说流本质都是二进制。但是实际操作起来有的是字符串。于是就有了TextStream、StreamReader把他们装饰成文本流并提供新的api。
http://www.dnsts.com.cn/news/258971.html

相关文章:

  • 做外贸网站格式长沙传统网络营销策略
  • 石家庄网站建设seo优化营销2022网站快速收录技术
  • 网站开发不兼容ie8工程公司简介范文大全
  • 通辽网站建设0475seo哈尔滨调整部分地区风险等级
  • 做网站本溪深圳哪家公司做网站好
  • 查建设标准网站网站规划与建设需求分析
  • 网站开发的总结漯河建设网站
  • 网站接入地怎样建设网站首页
  • 图书馆建设网站需要哪些费用成都建设网上商城平台公司
  • 网站建设与维护视频教程设计网站的步骤有哪些
  • 济南网站建设公司 推荐行知科技平台推广
  • 怎么建一个购物网站营销型网站建设易网拓
  • 网站代备案服务寻找小程序代理
  • 营销型网站建设方案演讲ppth5网站搭建
  • 在婚恋网站做销售好吗百度描述 网站
  • 营销型网站有意义吗制冷机电工程东莞网站建设
  • 旅游类网站策划建设_wordpress 注册页面插件
  • 美工网站设计收费拦截网站做跳转
  • 个人建站建设网站服务器数据库
  • 网站运营意义网站开发公司制作平台
  • 做网站 指导wordpress 动作hook
  • 品牌网站建设S苏州wordpress下载站
  • 朝阳网络 网站建设电商运营团队
  • 简述织梦网站上传步骤东莞行业推广
  • 龙口网站建设公司报价厦门百度搜索网站排名
  • 什么学做网站中国企业网站设计案例
  • 忘记网站后台登陆地址报告总结网站建设实验
  • 梅州做网站平面设计vi是什么意思
  • 网站开发深圳公司企业网站推广怎么做
  • vps建两个网站要两个程序池吗电子商务网站开发过程论文