代码之家  ›  专栏  ›  技术社区  ›  Greg

整个类的C#IDisposable对象

  •  3
  • Greg  · 技术社区  · 14 年前

    我目前正在处理的项目在类中的每个方法中都使用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 回复  |  直到 12 年前
        1
  •  13
  •   Jon Skeet    14 年前

    能够

    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> 因为您希望能够从方法返回值。)

        2
  •  3
  •   samy    14 年前

    坦白地说,我会保留冗长的代码,但是每次都使用一个片段而不是全部键入。 或者用 special tool 或者使用文本替换工具,如 Texter

        3
  •  0
  •   Jordão    14 年前

    也许一个简单的重构是最好的,你可以不诉诸于像 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>();
      }
    }