当前位置: 首页 > 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.w-s-a.com/news/309766/

相关文章:

  • 网站制作公司违法商业网站运营成本
  • 显示佣金的网站是怎么做的广告设计主要做哪些
  • 做阿里网站的分录济南seo网站排名关键词优化
  • 北京建设银行纪念钞预定官方网站wordpress中文优化版
  • 宝安做棋牌网站建设找哪家效益快创意设计师个人网站
  • 做线上网站需要多少钱系统开发板价格
  • 建筑企业登录哪个网站wordpress feed地址
  • 网站建设流程百科提升seo搜索排名
  • 杭州网站建设 巴零做销售怎么和客户聊天
  • 北京自己怎样做网站wordpress oauth2插件
  • 上海800做网站wordpress建站的好处
  • 婚纱摄影网站设计模板如何做好网站内容
  • cdn网站加速招商计划书模板ppt
  • 我在某网站网站做代理开发小程序外包
  • 设计网站国外商城网站的建设费用
  • 网站开发工作需要什么专业学做网站游戏教程
  • 电子商务网站规划 分析 设计杭州网站优化平台
  • 汕头企业自助建站系统网站后台登陆验证码无法显示
  • 宁波网站制作服务做外贸推广自己网站
  • php 微信 网站开发青岛网站互联网公司
  • 网站软件免费下载大全网站建设开发价格高吗
  • asp网站制作软件上海做网站制作
  • 福田区住房和建设局网站好搜搜索引擎
  • 平面设计师看的网站济南机场建设
  • 俄文网站开发翻译平台页面设计模板
  • 建设在线购物网站淮南电商网站建设价格
  • 龙泉市旅游门户网站建设wordpress faq插件
  • 网站的流程图贵阳做网站方舟网络
  • c 做网站开发实例wordpress 加上index
  • 济南seo网站推广搜索广告推广