【发布时间】:2012-04-23 17:43:04
【问题描述】:
我的一些代码有很多重复。问题来自于我正在处理嵌套的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) ...但这里不是这样。
【问题讨论】:
-
+1 我没有在您的解决方案中看到任何笨拙的东西。它是一种非正统的比程序更实用的方法,但我认为它是专业的,而不是缺点
-
我认为您的实现看起来不错,但也许您会更喜欢下面提供的一些替代方案。如果您发现自己不得不捆绑大量一次性用品,您可能需要重新设计一些东西,以免最终陷入这种情况。
标签: c# refactoring using-statement code-duplication