整个类的C#IDisposable对象

时间:2010-10-04 13:34:28

标签: c# refactoring code-reuse using-statement

我目前正在处理的项目在类中的每个方法中使用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...
        }
    }
}

3 个答案:

答案 0 :(得分: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>,因为您希望能够从方法中返回值。)

答案 1 :(得分:3)

坦率地说,我会保留详细的代码,但每次使用代码片段而不是全部输入代码。 使用special tool创建自己的代码段或使用Texter等文本替换工具

答案 2 :(得分: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>();
  }
}