C # IDisposable объект для всего класса - PullRequest
3 голосов
/ 04 октября 2010

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

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...
        }
    }
}

Ответы [ 3 ]

13 голосов
/ 04 октября 2010

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

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>, поскольку вы хотите иметь возможность возвращать значения из ваших методов.)

3 голосов
/ 04 октября 2010

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

0 голосов
/ 04 октября 2010

Возможно, простой рефакторинг - это лучшее, что вы можете сделать, не прибегая к чему-то вроде 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>();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...