2010-10-04 49 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

我已經學到了一些東西,從你的回覆 - 一直試圖讓我的腦袋圍繞lambda表達式並在真實世界中使用它們。謝謝。 – Greg 2010-10-04 13:38:07

+0

@Downvoter:小心給個理由? – 2010-10-04 14:08:02

+0

不錯的解決方案......唯一的問題是如何讓單元測試變得更容易......我用IOC來注入上下文工廠,所以我想我回答了我自己的問題...... – 2010-10-04 18:25:26

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>(); 
    } 
}