業務場景是訂單支付完成之后需要把訂單信息到給倉庫系統,讓倉庫發貨;導出去之前需要檢查訂單的各種信息是否正確;
一開始做的是檢查6個內容,基本都是if-else這種邏輯實現,但是后來發現需要新增檢查邏輯的時候就很麻煩,而且代碼越寫越長;
現在想到一種實現方法,每種檢查邏輯單獨實現一個類,每個類共同實現一個接口;
邏輯一開始的時候通過反射找到所有實現該接口的類,循環調用每個類的實現;
這樣一來就可以每次新增校驗邏輯的時候,原來的類不用動,只需要增加一個新類,並且實現接口就可以。
var assemblies = new List<Assembly>() { typeof(OEAppHost).Assembly };
var types = assemblies.SelectMany(x => x.GetTypes())
.Where(x => (x.GetInterfaces().Contains(typeof(ICheckOrder))))
.ToArray();
var checkOrderInstances = types.Select(x=>Activator.CreateInstance(x)).ToList();
void RunNeedCheckProcess(object instance)
{
try
{
if (instance is ICheckOrder checkOrder)
checkOrder.Execute();
}
catch (Exception)
{
}
}
checkOrderInstances.ForEach(RunNeedCheckProcess);
static class ReflectExtension
{
public static bool HasInterface(this Type type, Type interfaceType)
{
foreach (var t in type.GetInterfaces())
{
if (t == interfaceType)
return true;
}
return false;
}
}
public interface ICheckOrder
{
void Execute();
}
public class CheckOrderName : ICheckOrder
{
public void Execute()
{
//throw new NotImplementedException();
}
}