我所有的東西我一直在嘗試做一段時間,還沒有找到一個好的策略來做到這一點,我不知道C#甚至可以支持我想要做的事情。C#尋找新工具的工具箱,如何模板這個代碼
示例想象一個像這樣的模板,在管理代碼中重複遍歷cocept函數返回由成功標誌和錯誤列表組成的結果。
public Result<Boolean> RemoveLocation(LocationKey key)
{
List<Error> errorList = new List<Error>();
Boolean result = null;
try{
result = locationDAO.RemoveLocation(key);
}catch(UpdateException ue){
//Error happened less pass this back to the user!
errorList = ue.ErrorList;
}
return new Result<Boolean>(result, errorList);
}
展望變成下面那裏做類似的模板是一些電話(最好不是靜態的),它返回一個布爾值。我知道我可以在堆棧的意義上做到這一點,但我真的想通過對象引用來做到這一點。
public Result<Boolean> RemoveLocation(LocationKey key)
{
var magic = locationDAO.RemoveLocation(key);
return ProtectedDAOCall(magic);
}
public Result<Boolean> CreateLocation(LocationKey key)
{
var magic = locationDAO.CreateLocation(key);
return ProtectedDAOCall(magic);
}
public Result<Boolean> ProtectedDAOCall(Func<..., bool> doSomething)
{
List<Error> errorList = new List<Error>();
Boolean result = null;
try{
result = doSomething();
}catch(UpdateException ue){
//Error happened less pass this back to the user!
errorList = ue.ErrorList;
}
return new Result<Boolean>(result, errorList);
}
如果有任何更多的信息,你可能需要告訴我。
我很想看看別人能想出什麼。
馬克的解決方案應用到上面的代碼
public Result<Boolean> CreateLocation(LocationKey key)
{
LocationDAO locationDAO = new LocationDAO();
return WrapMethod(() => locationDAO.CreateLocation(key));
}
public Result<Boolean> RemoveLocation(LocationKey key)
{
LocationDAO locationDAO = new LocationDAO();
return WrapMethod(() => locationDAO.RemoveLocation(key));
}
static Result<T> WrapMethod<T>(Func<Result<T>> func)
{
try
{
return func();
}
catch (UpdateException ue)
{
return new Result<T>(default(T), ue.Errors);
}
}
我不喜歡那個異常包裝的外觀,順便說一句。例外*已經*氣泡和結果*已經*返回。你不需要爲此創造一個新的隱喻。 – 2010-03-31 16:04:23
這是一個例子,這個想法是我需要的。有更多的修剪邏輯繼續清理最終暴露給用戶的異常。 – Nix 2010-03-31 16:44:37
我建議將'LocationDAO locationDAO = new LocationDAO();'移動到WrapMethod。請看下面 – vittore 2010-03-31 18:57:27