2010-10-04 3 views
3

В проекте, над которым я сейчас работаю, используется объект IDisposable для каждого метода в классе. Он начал получать утомительный повторный ввод блока использования в начале каждого метода и задавался вопросом, существует ли способ указать одноразовую переменную для использования в каждом методе класса?Объект C# IDisposable для всего класса

public static class ResourceItemRepository 
{ 
    public static ResourceItem GetById(int id) 
    { 
     using (var db = DataContextFactory.Create<TestDataContext>()) 
     { 
      // Code goes here... 
     } 
    } 
    public static List<ResourceItem> GetInCateogry(int catId) 
    { 
     using (var db = DataContextFactory.Create<TestDataContext>()) 
     { 
      // Code goes here... 
     } 
    } 
    public static ResourceItem.Type GetType(int id) 
    { 
     using (var db = DataContextFactory.Create<TestDataContext>()) 
     { 
      // Code goes here... 
     } 
    } 
} 

ответ

13

Нет, в этом нет ничего особенного. Вы могли написать:

public static ResourceItem GetById(int id) 
{ 
    WithDataContext(db => 
    { 
     // Code goes here... 
    }); 
} 

// Other methods here, all using WithDataContext 

// Now the only method with a using statement: 
private static T WithDataContext<T>(Func<TestDataContext, T> function) 
{ 
    using (var db = DataContextFactory.Create<TestDataContext>()) 
    { 
     return function(db); 
    } 
} 

Я не уверен, что это будет особенно полезным, хотя.

(Обратите внимание, что я должен был изменить его из Action<TestDataContext> в моей первоначальной версии к Func<TestDataContext, T>, как вы хотите, чтобы иметь возможность возвращать значения из ваших методов.)

+0

я узнал кое-что из ваш ответ - пытались окунуться в лямбда-выражения и использовать их в реальном мире. Благодарю. – Greg

+0

@ Downvoter: Уход за причину? –

+0

Хорошее решение ... Вопрос только в том, как упростить модульный тест ... Я использовал IOC для ввода фабрики контекста, поэтому, я думаю, я ответил на свой вопрос ... –

3

Честно говоря, я бы сохранить подробный код, но используя фрагмент вместо того, чтобы вводить его каждый раз. Либо создать свой собственный фрагмент кода с special tool или использовать текст-запасные инструменты, такие как Texter

0

Может быть простой рефакторинг это лучшее, что вы можете сделать, не прибегая к чему-то вроде PostSharp:

public static class ResourceItemRepository { 
    public static ResourceItem GetById(int id) { 
    using (var db = CreateDataContext()) { 
     // Code goes here... 
    } 
    } 
    public static List<ResourceItem> GetInCateogry(int catId) { 
    using (var db = CreateDataContext()) { 
     // Code goes here... 
    } 
    } 
    public static ResourceItem.Type GetType(int id) { 
    using (var db = CreateDataContext()) { 
     // Code goes here... 
    } 
    } 
    private static TestDataContext CreateDataContext() { 
    return DataContextFactory.Create<TestDataContext>(); 
    } 
}