非常に多くの重複があるコードがあります。問題は、ネストされた型を扱っているという事実から来てい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
ブロック全体は、これらの各メソッドで同じです(2つが示されていますが、約10個あります)。using
唯一異なるのは、ブロックの内側のレベルに到達したときに何が起こるかです。
私が考えていた1つの方法は、次のようなことをすることです。
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)
ますが、ここではそうではありません。