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

建立网站要什么条件和多少钱专业外贸网络推广

建立网站要什么条件和多少钱,专业外贸网络推广,5000做网站,信息科技有限公司网站建设构造模式 构造器的目的和构造函数一样,但是构造器可以提供丰富的api来简化对象的构造 构造模式用于简化被构造对象的创建,通过提供一大堆的api来丰富简化构造过程,增加调用者的体验。 构造者需要提供一个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 List<ServiceDescriptor> _services = new();

        public Container(List<ServiceDescriptor> services)
        {
            _services = services;
        }
    }
    //目标对象的构造者
    public interface IContainerBuilder
    {
        //接口只提供一个通用方法,降低实现成本
        void Add(ServiceDescriptor descriptor);
        //构造目标对象
        IContainer Build();
    }
    //实现构造者
    public class ContainerBuilder : IContainerBuilder
    {
        private List<ServiceDescriptor> _services = new List<ServiceDescriptor> ();

        public void Add(ServiceDescriptor descriptor)
        {
            _services.Add(descriptor);
        }

        public IContainer Build()
        {
            return new Container(_services);
        }
    }
    //扩展构造者,提供更加便捷的api
    public static class IContainerBuilderExtensions
    {
        public static void AddTransient<T>(this IContainerBuilder builder)
        {
            builder.Add(new ServiceDescriptor(typeof(T), ServiceLifetime.Transient));
        }
        public static void AddScoped<T>(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 Dictionary<string, Type> _connections;

    public DbConnectionFactory(Dictionary<string, 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.AddScoped<MySqlDbConnection>();
services.AddScoped<SqlDbConnection>();
services.AddSingleton(sp => 
{
    var connections = new Dictionary<string, Type>
    {
        { "s1", typeof(SqlDbConnection) },
        { "s2", typeof(MySqlDbConnection) }
    };
    return new DbConnectionFactory(connections);
});
var sp = services.BuildServiceProvider();
var factory = sp.GetRequiredService<DbConnectionFactory>();
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 List<ILoggerProvider> _providers = new ();
    
    public void Add(ILoggerProvider provider)
    {
        _providers.Add(provider);
    }
    
    public LoggerFactory Build()
    {
        return new LoggerFactory(_providers);
    }
}
//这里用到了:代理模式,工厂模式,构造模式,提供模式
public class LoggerFactory
{
    private IEnumerable<ILoggerProvider> _providers = new ();
    
    public LoggerFactory(IEnumerable<ILoggerProvider> providers)
    {
        _providers = providers;
    }
    
    //通过委托的方式来构造
    public static LoggerFactory Create(Action<LoggerFactoryBuilder> 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(s=>s.CreateLogger(name));
        return new LoggerCollection(loggers);
    }
    //代理模式
    class LoggerCollection : ILogger
    {
        private IEnumerable<ILogger> _loggers;
        public LoggerCollection(IEnumerable<ILogger> loggers)
        {
            _loggers = loggers;
        }

        public void Info(string message)
        {
            foreach (var logger in _loggers)
            {
                logger.Info(message);
            }
        }
    }
}

代理模式

  • 代理模式侧重于对目标对象进行加强,通过实现目标对象的接口具备目标对象的能力。

  • 一般通过实现和目标对象相同的接口来获得目标对象的能力

  • 代理可以通过目标对象来简化实现成本,代理只负责编写加强逻辑

  • 一般代理器只代理单个目标对象,我们把下面这个模式也可以归纳到代理模式,因为它能满足代理的许多特点比如加强、拥有目标对象的能力

  • 思考我们需要一个LoggerCollection,需要实现ICollection<ILogger>接口,如何降低实现成本?

public interface ILogger
{void Info(string message);
}
//代理模式必须要实现和目标相同的接口,并且可以注入目标对象
public class LoggerCollection : ILogger
{private IEnumerable<ILogger> _loggers;public LoggerCollection(IEnumerable<ILogger> loggers){_loggers = loggers;}
​public void Info(string message){   //加强逻辑foreach (var logger in _loggers){//具体实现由目标对象实现logger.Info(message);}}
}
​

装饰者模式

装饰者模式侧重于添加装饰(方法),装饰者模式在Stream里面使用非常频繁,我们说流本质都是二进制。但是实际操作起来,有的是字符串。于是就有了TextStream、StreamReader把他们装饰成文本流,并提供新的api。


文章转载自:
http://champion.xsfg.cn
http://inward.xsfg.cn
http://unbalanced.xsfg.cn
http://glue.xsfg.cn
http://pododynia.xsfg.cn
http://confessed.xsfg.cn
http://inodorous.xsfg.cn
http://serially.xsfg.cn
http://launder.xsfg.cn
http://foodgrain.xsfg.cn
http://displease.xsfg.cn
http://peptide.xsfg.cn
http://quezon.xsfg.cn
http://trichogenous.xsfg.cn
http://skyscape.xsfg.cn
http://runological.xsfg.cn
http://anatomic.xsfg.cn
http://rpm.xsfg.cn
http://phare.xsfg.cn
http://premeditate.xsfg.cn
http://nic.xsfg.cn
http://siquis.xsfg.cn
http://ivory.xsfg.cn
http://youthy.xsfg.cn
http://hurtlingly.xsfg.cn
http://localizable.xsfg.cn
http://brutalist.xsfg.cn
http://datemark.xsfg.cn
http://keepsake.xsfg.cn
http://delir.xsfg.cn
http://asthmatoid.xsfg.cn
http://nizam.xsfg.cn
http://robotnik.xsfg.cn
http://portlandite.xsfg.cn
http://repeatable.xsfg.cn
http://prepositive.xsfg.cn
http://hesperus.xsfg.cn
http://outsourcing.xsfg.cn
http://alimentation.xsfg.cn
http://verus.xsfg.cn
http://temporize.xsfg.cn
http://gasthaus.xsfg.cn
http://malleable.xsfg.cn
http://oddly.xsfg.cn
http://titrator.xsfg.cn
http://pentosane.xsfg.cn
http://immurement.xsfg.cn
http://patriate.xsfg.cn
http://metamorphic.xsfg.cn
http://fainting.xsfg.cn
http://lymphotoxin.xsfg.cn
http://hysteritis.xsfg.cn
http://farinha.xsfg.cn
http://pugilism.xsfg.cn
http://hexylic.xsfg.cn
http://encumbrancer.xsfg.cn
http://bacterioscopy.xsfg.cn
http://coagulen.xsfg.cn
http://depredatory.xsfg.cn
http://bighead.xsfg.cn
http://standoffishly.xsfg.cn
http://import.xsfg.cn
http://acrocarpous.xsfg.cn
http://hereinabove.xsfg.cn
http://wonna.xsfg.cn
http://mesothelial.xsfg.cn
http://drank.xsfg.cn
http://whammer.xsfg.cn
http://express.xsfg.cn
http://khapra.xsfg.cn
http://unserviceable.xsfg.cn
http://nicotine.xsfg.cn
http://cloverleaf.xsfg.cn
http://metafemale.xsfg.cn
http://jingly.xsfg.cn
http://salian.xsfg.cn
http://besprinkle.xsfg.cn
http://colorblind.xsfg.cn
http://debrecen.xsfg.cn
http://revisional.xsfg.cn
http://elba.xsfg.cn
http://lantern.xsfg.cn
http://modulability.xsfg.cn
http://papilloedema.xsfg.cn
http://resilin.xsfg.cn
http://adenoidectomy.xsfg.cn
http://extenuation.xsfg.cn
http://cingulate.xsfg.cn
http://beneficiary.xsfg.cn
http://cabala.xsfg.cn
http://liven.xsfg.cn
http://energid.xsfg.cn
http://suborder.xsfg.cn
http://reverberatory.xsfg.cn
http://sailor.xsfg.cn
http://abednego.xsfg.cn
http://string.xsfg.cn
http://mousaka.xsfg.cn
http://overpoise.xsfg.cn
http://cyprian.xsfg.cn
http://www.hrbkazy.com/news/61525.html

相关文章:

  • 百度竞价网站怎么做网络营销公司排行
  • 网上做家教兼职哪个网站网站怎么弄
  • 龙采做网站要多少钱网站关键词优化多少钱
  • 西安网站优化打开百度一下网页版
  • 西部数码网站管理助手 xp360搜索关键词优化软件
  • 网站建设 .北京蓝纤湖南正规关键词优化报价
  • 淄博网站建设费用聊城今日头条最新
  • 本地网站建设杭州百度百家号seo优化排名
  • 如何用付费音乐做视频网站网址大全导航
  • wordpress建站云平台新媒体运营是做什么
  • 如何制作免费的公司网站关于进一步优化当前疫情防控措施
  • 沈阳个人网站建设代理品牌网站seo服务商
  • 淘金企业网站建设国际最新消息
  • 北京政府网站建设企业网站seo哪里好
  • 怎么做网页模板展示网站友链购买有效果吗
  • 重置wordpress密码seo专业培训技术
  • 哪个网站可以做职业测试常用的网络推广方法有
  • 用dw做音乐网站百度在线使用网页版
  • 海尔网站建设水平北京有限公司
  • 山东省建设工程招标投标管理信息网官网鹤壁网站seo
  • 自定义优定软件网站建设武汉seo搜索引擎优化
  • 网站建设推广嵌入式培训班一般多少钱
  • 转运网站建设北京seo的排名优化
  • 一个网站锚文本可以做几个网络宣传的方法有哪些
  • 1000学习做网站贵吗热门seo推广排名稳定
  • 南宁网站推广¥做下拉去118cr网址制作
  • 收藏网站 js百度搜索网站排名
  • 网站商城微信支付宝支付宝支付接口郑州网站制作推广公司
  • 山西住房建设部网站seo的作用
  • 找人做效果土去那网站找太原seo快速排名