我有一些代碼有很多重複。問題來自我正在處理嵌套IDisposable
類型的事實。今天,我有東西,看起來像:一個重構代碼如何能夠嵌套使用?
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
}
}
public bool GetSomeValueById(Guid innerId)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
return c.GetSomeValue();
}
}
整個嵌套using
塊是每種方法相同(顯示了兩個,但也有他們的約10次)。唯一不同的是當你進入using
塊的內層時會發生什麼。我在想
一種方法是將線沿線的做一些事情:
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
ActOnC(innerId, c =>
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
});
}
public bool GetSomeValueById(Guid innerId)
{
var result = null;
ActOnC(innerId, c => { result = c.GetSomeValue(); });
return result;
}
private void ActOnC(Guid innerId, Action<TheCType> action)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
action(c);
}
}
這個工作,它只是一種笨重解析(人類)。 有沒有人有任何其他的建議,可以減少嵌套的using
塊這樣的代碼重複?如果他們不是IDisposable
那麼人們可能會創建一個方法來返回b.GetC(innerId)
的結果......但這不是這裏的情況。
+1我沒有看到任何解決方案中的笨重。這是一種非正統的比程序更具功能性,但我會把它算作專業人士,而不是一個騙子 – mfeingold 2012-04-23 17:49:39
我認爲你的實現看起來不錯,但你可能會更喜歡下面提供的一些替代方案。如果你發現自己必須鏈接很多一次性用品,你可能需要重新設計一些東西,以免在這種情況下出現。 – Thomas 2012-04-23 17:58:45