【C#编程最佳实践 三】接口使用实践
目前使用到的接口使用方法大概就以下这两种,之后在持续更新,第一种就是使用工厂,第二种就是字典类。接下来详细介绍这两种方法,用好了就可以说把多态玩儿溜了。
工厂类的使用实践
创建工厂类
namespace Factory
{
internal class ConverterFactory : FactoryBase<ConverterFactory, IConditionKeyBuilder>, IFactory<IConditionKeyBuilder>
{
public IConditionKeyBuilder NewObject(string className)
{
var result = ReflectionHelper.CreateInstance<IConditionKeyBuilder>("程序集", "命名空间." + className);
if (result == null)
{
throw new ConfigException($"{className}反射失败");
}
return result;
}
}
}
调用工厂类
调用的时候
newrow.ConditionCode =
ConverterFactory.Instance.CreateObject("FieldCombinationConditionKeyBuilder").GetKeyMethod(newrow, tableconfig.Name);
字典类和接口组合的使用实践
特征码的接口和实现类
在使用的时候就可以直接依据传入的字符串来判断
//=====================================================特征码设置(依据需求判断使用哪个方法)=============================================================
//使用接口和实现类来设置特征码
public static readonly Dictionary<string, ConditionKeyBuilder> conditionKeyBuilder = new Dictionary<string, ConditionKeyBuilder>() { //不同方法的解决接口
{ "FieldCombinationConditionKeyBuilder",new FieldCombinationConditionKeyBuilder(MetaDataBaseName) },
{ "ValueMappingConditionKeyBuilder",new ValueMappingConditionKeyBuilder() }
};
/// <summary>
/// 根据相应的方法名获取相应的获取特征码的方式
/// </summary>
/// <param name="method"></param>
/// <returns></returns>
private ConditionKeyBuilder GetConditionKey(string builderName)
{
if (conditionKeyBuilder.ContainsKey(builderName))
{
return conditionKeyBuilder[builderName];
}
return null;
}
#region 检测该库所有表的数据迁移
比较规则的接口和实现类
在使用的时候就可以直接依据传入的字符串来判断
#region 白名单设置,获取对应方法
//===========================================白名单设置============================
public static readonly Dictionary<string, MethodProvider> methodProvider = new Dictionary<string, MethodProvider>() { //不同方法的解决接口
{ "Equal",new EqualMethodProvider() },
{ "Mapping",new MappingMethodProvider() },
{ "TenanatReplace",new TenanatReplaceMethodProvider() }
};
/// <summary>
/// 根据相应的方法名获取相应的算法处理方法
/// </summary>
/// <param name="method"></param>
/// <returns></returns>
private MethodProvider GetMethodProvider(string method)
{
if (methodProvider.ContainsKey(method))
{
return methodProvider[method];
}
return null;
}
#endregion 白名单设置,获取对应方法
字典类获取列名
还可以通过字典类,将对应的列序号和列明封装到字典类,这样之后对每行数据处理的时候可以随时获得当前处理字段的字段名,例如
//使用字典类获取一个列名和列次序的映射
var dt = new Dictionary<int, String>();
for (var j = 0; j < sourceTable.Columns.Count; j++)
{
var col = sourceTable.Columns[j];
dt.Add(j, col.ColumnName);
}