我有一些重复很多的代码。问题来自我正在处理嵌套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
块都是相同的(显示了两个,但大约有十个)。唯一不同的是当你到达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)
...的结果,但这里不是这种情况。