<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[anfeng4628的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/anfeng4628</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; anfeng4628]]></copyright><item><title><![CDATA[abp模块生命周期设计思路剖析]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350342</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350342</guid><author>anfeng4628</author><pubDate>Sat, 05 Oct 2019 16:50:00 +0800</pubDate><description><![CDATA[abp中将生命周期事件抽象为4个接口：
//预初始化
public interface IOnPreApplicationInitialization
{
    void OnPreApplicationInitialization([NotNull] ApplicationInitializationContext context);
}

//初始化
public interfac...]]></description><category></category></item><item><title><![CDATA[条件语句重构分析]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350340</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350340</guid><author>anfeng4628</author><pubDate>Tue, 23 Jul 2019 22:32:00 +0800</pubDate><description><![CDATA[条件语句重构分析
策略模式重构条件语句
状态模式重构条件语句
多态重构条件语句
其实这三种方式都是基于多态实现的，直接加上了各个的特性罢了。策略模式相比较状态模式，前者由客户端传入所有的选择项，而后在Context环境类中选择具体的选项、后者则是在Context状态管理器中根据客户端传入的选择通过SetAddress切换状态。这两者充分体现了其模式的特定——策略模式是客户端已经知道了所有...]]></description><category></category></item><item><title><![CDATA[模式：工程化实现及扩展——工厂模式]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350341</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350341</guid><author>anfeng4628</author><pubDate>Thu, 11 Jul 2019 23:35:00 +0800</pubDate><description><![CDATA[相比较传统的工厂模式IFactory/Concrete Factory会反复引用并编译代码
但是作为开发人员，我们更希望的是少修改代码，尽量从配置着手也就是设计模式的根本原则之一：开放封闭原则。如果我要增加新的产品，那么修改就比较大了，对于业务来讲还是可以接受的。但是如果可以做到不修改代码是最好的。上一份工作中，我印象最深的一句话就是我上司对我说的"能不改代码就别改，能写进配置里的就写到...]]></description><category></category></item><item><title><![CDATA[状态模式重构条件语句]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350338</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350338</guid><author>anfeng4628</author><pubDate>Sun, 07 Jul 2019 10:21:00 +0800</pubDate><description><![CDATA[状态模式重构条件语句
直接上代码：
/// &lt;summary&gt;
/// 状态模式的环境类
/// &lt;/summary&gt;
public class CalculateContext
{
    private IShippingAmount _Calculate;
    public CalculateContext() =&gt; _Calculate = ne...]]></description><category></category></item><item><title><![CDATA[多态重构条件语句]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350339</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350339</guid><author>anfeng4628</author><pubDate>Sat, 06 Jul 2019 14:59:00 +0800</pubDate><description><![CDATA[首先，在C#中，多态的体现是什么？虚函数、抽象方法、接口。废话不多说，直接上代码：
#region 多态重构switch...case....

    public abstract class ShippingCalculation
    {
        public abstract decimal Calculate();
    }

    public class A...]]></description><category></category></item><item><title><![CDATA[AssemblyBuilder以及Activator双剑合璧]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350336</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350336</guid><author>anfeng4628</author><pubDate>Thu, 20 Jun 2019 17:53:00 +0800</pubDate><description><![CDATA[AssemblyBuilder和Activator两个类是DispatchProxy类实现动态代理以及AOP的根本，示例demo可参考 DispatchProxy实现动态代理及AOP 。AssemblyBuilder的命名空间是System.Reflection.Emit，没错就是你听过的Emit。那么它是干什么用的？先看看 官方 的示例代码：
// ↓ AssemblyBuilder构...]]></description><category></category></item><item><title><![CDATA[DispatchProxy实现动态代理及AOP]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350337</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350337</guid><author>anfeng4628</author><pubDate>Thu, 20 Jun 2019 14:38:00 +0800</pubDate><description><![CDATA[DispatchProxy类是DotnetCore下的动态代理的类，源码地址：Github，官方文档：MSDN。主要是Activator以及AssemblyBuilder来实现的（请看源码分析），园子里的蒋老大提供的AOP框架Dora的实现也是大量使用了这两个，不过DispatchProxy的实现更简单点。
AOP实现：
#region 动态代理 dispatchproxy aop示例
...]]></description><category></category></item><item><title><![CDATA[策略模式重构条件语句]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350335</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350335</guid><author>anfeng4628</author><pubDate>Wed, 05 Jun 2019 18:26:00 +0800</pubDate><description><![CDATA[通过策略模式来重构优化代码里面的switch/case分支代码。极大程度上提高了程序的扩展性。当然，如果分支比较多，每次都需要新增加一个类，这的确是有点麻烦，可以考虑使用反射来实现。
代码：
namespace DP
{
    public enum State
    {
        Alaska,
        NewYork,
        Florida
    }

...]]></description><category></category></item><item><title><![CDATA[观察者模式-C#实现]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350334</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350334</guid><author>anfeng4628</author><pubDate>Mon, 03 Jun 2019 21:10:00 +0800</pubDate><description><![CDATA[定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。
观察者模式有四个角色：抽象主题、具体主题、抽象观察者、具体观察者。
抽象主题：把所有观察者对象的引用保存到一个聚集里，每个主题都可以有任何数量的观察者。
具体主题：将有关状态存入具体观察者对象；在具体主题内部状态改变时，给所有登记过的观察者发出通知。
抽象观察者：为所有的具体观察者定...]]></description><category></category></item><item><title><![CDATA[日常开发规范（持续更新）]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350333</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350333</guid><author>anfeng4628</author><pubDate>Sun, 26 May 2019 15:56:00 +0800</pubDate><description><![CDATA[开发注意事项

建表时，一定要选择好可能需要建索引的字段，而且尽量为多个字段建立 多列索引 而不是为每个字段建立单列索引，要不然后期数据量一大，查询将会非常慢
select where order by等sql关键字后最好接索引字段，要不然容易走全表查询，在编写sql语句时，可先使用explain查看语句的执行结果，可参考 MySQL高级知识（六）——索引优化
在代码中尽量多用async...]]></description><category></category></item><item><title><![CDATA[工厂模式-C#改良实现]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350332</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350332</guid><author>anfeng4628</author><pubDate>Fri, 24 May 2019 11:34:00 +0800</pubDate><description><![CDATA[参考了下网上的工厂模式实现，总的来说例子还是OK得，但是示例太单一了，因此我做了下优化的改良实现。
namespace DP
{
    public interface ICreditCard
    {
        string GetCardType();
        int GetCreditLimit();
        int GetAnnualCharge();
...]]></description><category></category></item><item><title><![CDATA[建造者模式-C#改良实现]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350331</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350331</guid><author>anfeng4628</author><pubDate>Wed, 15 May 2019 14:30:00 +0800</pubDate><description><![CDATA[区分网上已有的一般建造者模式实现，个人觉得实现太单一了，自己google查了一些好的实现，挑了其中比较适合的，做个笔记。
    # region 标准Builder模式实现

    // 产品
    class Television
    {
        public string Code { get; set; }
        public string Displa...]]></description><category></category></item><item><title><![CDATA[设计模式学习心得（持续更新）]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350330</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350330</guid><author>anfeng4628</author><pubDate>Tue, 14 May 2019 11:52:00 +0800</pubDate><description><![CDATA[本博文仅仅是笔者自己的学习路线，归纳整理了一些好的设计模式资料。
1、策略模式
参考资料：c#设计模式-策略模式 c#设计模式之策略模式
定义是：封装一组算法，每个算法为独立的类，可以相互替代，因为它们有相似的行为。
策略模式主要是将产品共有的部分抽象出来，不同的行为据此抽象作不同的具体实现，最后再有一个Context解耦客户端调用与服务端的实现，客户端是明确知道有哪些行为的。
注意： ...]]></description><category></category></item><item><title><![CDATA[996 不是福气，努力也未必成功（转）]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350328</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350328</guid><author>anfeng4628</author><pubDate>Wed, 24 Apr 2019 10:37:00 +0800</pubDate><description><![CDATA[那一年，我加入了某知名公司的某知名部门，在办公室中，我看到了到处都挂着——“努力就会成功”的条幅，这个部门中大多数员工的邮件签名都会有“努力就会成功”，我感到一种热血沸腾的气氛，这是我在多年工作来都没有感受到的，当时挺高兴地能和这样一群人工作，也没多想。直到有一天，我看到这些高级的软件工程师们把自己关在又挤又吵的会议室中，拼命地加班，真是拼命，周一到周日，每天早上 10 点到凌晨 3 点...]]></description><category></category></item><item><title><![CDATA[AspNetCore.AsyncInitialization库源码分析]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350329</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350329</guid><author>anfeng4628</author><pubDate>Sun, 21 Apr 2019 19:50:00 +0800</pubDate><description><![CDATA[AspNetCore.AsyncInitialization这个库是用来实现在asp.net core应用程序启动时异步执行异步任务。可参考：如何在ASP.NET Core程序启动时运行异步任务（2）。IAsyncInitializer接口就是用来实现执行异步任务的接口，此接口签名：

public interface IAsyncInitializer
    {
     ...]]></description><category></category></item><item><title><![CDATA[docker-compose模板文件]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350327</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350327</guid><author>anfeng4628</author><pubDate>Wed, 17 Apr 2019 20:18:00 +0800</pubDate><description><![CDATA[mysql、redis、asp.net core项目应用程序三个常见的docker-compose文件模板参考：

version: "3"
services:
  mysql:
    restart: always
    image: hub.duoyioa.com/public/mysql:5.7.18
    container_name: ${SERVICE_N...]]></description><category></category></item><item><title><![CDATA[asp.net core1.1的PlatformAbstraction源码]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350326</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350326</guid><author>anfeng4628</author><pubDate>Tue, 16 Apr 2019 17:10:00 +0800</pubDate><description><![CDATA[PlatformAbstraction类在现在的asp.net core中已经废弃了，但是此类的设计还是不错的，可以借鉴，源码如下：

namespace Microsoft.Extensions.PlatformAbstractions
{
    public class PlatformServices
    {
        private PlatformSer...]]></description><category></category></item><item><title><![CDATA[docker-compose模板文件参数说明]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350324</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350324</guid><author>anfeng4628</author><pubDate>Sun, 14 Apr 2019 20:09:00 +0800</pubDate><description><![CDATA[working_dir：一般这个参数用在应用程序Services下，我们指定应用程序所在的目录为当前目录，类似linux中的cd working_dir。其余的参数，例如command等就是基于此参数指定的目录下执行的。
docker-entrypoint-initdb.d：此参数用于在第一次启动docker的时候，执行sh文件以及sql文件用于初始化数据库等。
docker从入门...]]></description><category></category></item><item><title><![CDATA[easynetq发布订阅demo实现注意事项]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350325</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350325</guid><author>anfeng4628</author><pubDate>Fri, 29 Mar 2019 21:25:00 +0800</pubDate><description><![CDATA[最近开始在项目中使用easynetq，大概了解了下api，在网上看了下示例，结果没有一个运行成功的，一个最简单的发布订阅都没有成功。我是直接运行起来别人的示例，不应该啊，后来一直分析一直分析，最后发现：消息没有序列化！这还是其一，第二点，应该要先起来消息接收端，再起来消息发布端。一开始就是简单的：

static void Main()
        {
           ...]]></description><category></category></item><item><title><![CDATA[C#的排序Sort和OrderBy扩展方法]]></title><link>https://blog.youkuaiyun.com/anfeng4628/article/details/102350196</link><guid>https://blog.youkuaiyun.com/anfeng4628/article/details/102350196</guid><author>anfeng4628</author><pubDate>Mon, 25 Mar 2019 21:03:00 +0800</pubDate><description><![CDATA[可以实现一个IComparable接口的CompareTo方法，或者是给予List的Sort扩展方法，传入委托实现，举个例子：

list.Sort((a, b) =&gt; {
                var o = a.sortIndex - b.sortIndex;
                return o;
            })

其实我们...]]></description><category></category></item></channel></rss>