【C#编程最佳实践 十七】反射工厂最佳实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_33087001/article/details/81501623

最近写了一个功能就是通过传入不同的rule实现不同的规则,这里rule是个字符串,按照常理来说,我们最先想到的是switch case,但Switch case有个问题就是代码耦合度会特别高,想起武哥之前说的一段话:写代码时不时就要review一下,写第一个方法可以大概写,第二个方法就得想想和上一个可不可以重用,能重用多少,再多几个方法的时候就得思考可不可以用工厂来实现,于是,这一次再武哥又一次的提醒下,发现了这里的代码可以重用,那么一个工厂类怎么写才能叫一个好的工厂类呢?那当然就是反射接口的工厂类了,依据反射,通过名字拿到具体的类。

结构

从结构上来看,如果是完成解决同一类问题的不同方法,首先想到的就是接口,通过接口可以轻松解耦代码,例如,假设我这里需要解决喝开门的问题,就可以有用手推开,用脚踢开等多个方法,方法的名称可以一样,在接口里定义,但方法的实现各自不同。对于我目前的问题就是:我要校验数据,而对于不同的数据需要使用不同的校验方法,结构上来看就是一个接口形式(当然你可以用switch case,但会使代码看上去很冗余,而且耦合度很高,不可扩展
这里写图片描述

其中IJsonCompareRule就是这里的接口方法,而CompareFactory就是我们这里定义的反射接口工厂,反射接口工厂的作用就是仅仅通过规则的名称就可以把规则类拿到。下面看详细操作

定义

IJsonCompareRule代码清单:


    internal interface IJsonCompareRule
    {
        //用来比较的接口方法
        bool JsonCompare(JsonCompareModel jsonCompareModel, ref StringBuilder failureMessage, ref int count);
    }

CompareFactory代码清单:

namespace TML
{
    internal class ConverterFactory : FactoryBase<ConverterFactory, IJsonCompareRule>, IFactory<IJsonCompareRule>     //IJsonCompareRule为接口
    {
        public IJsonCompareRule NewObject(string 类名称)
        {
            var result = CloudApp.Common.ReflectionHelper.CreateInstance<IJsonCompareRule>("程序集名称", "命名空间地址." + 类名称);
            if (result == null)
            {
                throw new ConfigException($"{className}反射失败");
            }
            return result;
        }
    }
}

使用

通过以上定义,在使用的时候就可以避免各种switch case,耦合度轻松降低

 ConverterFactory.Instance.NewObject(rule + "Rule").JsonCompare(jsonCompareModel, ref failureMessage, ref count);

核心思想:解耦,不停的想着review,It’s very important。

另外闲扯两句,今天听了运维的技术分享,感觉很棒啊,DevOps,自动化,透明运维,开发与运维的边界,应用运维的概念提的都非常棒,多了解些别人的工作领域,对于合作和成长之类的比较有用吧

猜你喜欢

转载自blog.csdn.net/sinat_33087001/article/details/81501623