Как можно провести рефакторинг кода, связанного с вложенными использованиями?

У меня есть некоторый код, в котором очень много дублирования. Проблема связана с тем, что я имею дело с вложенными 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)... но здесь это не так.

9
задан ckittel 23 April 2012 в 17:43
поделиться