2012-03-18 38 views
-3

我們想用sometihng的接口,用於力寫一些靜態方法(創建,刪除,更新)。什麼,我們可以用這樣的接口,但可以使用靜態方法類似接口

編輯:我們的項目,我們使用例如產品表。我們認爲我們創建了PruductDAL類,並且我們添加了Create(Product product)方法Update(Product product)方法Delete(int id)方法和GetById(int id)方法。並且我們認爲create static方法不要使用新的ProductDAL()並且不要創建類的實例。只需Product.Create(product)。

我們用4-5人編寫代碼,我認爲我們必須強迫每個人編寫包含壓縮方法的類。

我們必須遵循哪種方式?

+3

接口不是一種「強制別人寫方法」的機制。 – 2012-03-18 20:36:37

+0

您可以使用反射來檢查方法是否存在並且是靜態的 – cpoDesign 2012-03-18 20:43:33

+1

另外,在什麼情況下這會有用?如果你打算打電話,你只需要寫一個靜態方法。如果你試圖調用它,但它沒有被寫入,你會得到一個編譯器錯誤。 – 2012-03-18 20:56:58

回答

0

Static成員不會使實例但的類型的一部分,所以你在OOP方式想要的東西,你不能這樣做。

如果您想「強制」編寫靜態方法,請使用static class,但您會失去繼承功能。 static method,在我看到代碼的願景中,是一個信號無狀態的東西。所以使用static class,如果這組靜態方法實際上是你想要得到的,那麼可以爲你提供經濟實惠的解決方案。

當然,還有一個明顯的解決方案:與人交談並定義設計目標。

希望這會有所幫助。

+0

靜態可以有狀態...靜態類可以有靜態字段和屬性。 – MrLane 2012-03-19 03:21:56

+0

@MrLane:正確。我從不說這不是。我正在談論它對消費者的意圖*(信號)。那是。 – Tigran 2012-03-19 06:27:21

+0

這就夠公平了,許多開發者會同意你的看法,但我從來沒有得到過整個「靜態是沒有狀態」的行。對我來說,靜態類意味着全局而不是無狀態類。 – MrLane 2012-03-19 07:05:38

1

我假設你想強制子類實現一些靜態方法。

我不認爲這是一個正確的面向對象的概念,並且大多數情況下您的設計中存在問題。但是,如果你真的想這樣做。你可以有一個使用反射來檢查客戶端類是否定義了你需要的靜態方法並拋出運行時錯誤的基類。編譯時無法做到這一點。

但仍然,您的要求聞起來像不好的設計。

+0

「抽象」/「虛擬」類方法原則上完全正確。 C#不支持它們。在這種情況下,這可能是糟糕的設計,但是你不能一概而論。 – CodesInChaos 2012-03-18 21:13:01

0
class EnsureStaticMethodsGetWritten 
{ 
    Action ensure1 = ThatStaticClass.BetterImplementThis; 
    Func<Customer, bool> ensure2 = ThatStaticClass.BetterImplementThisToo; 
} 

只有ThatStaticClass具有這些方法,此類纔會編譯。

0

不要讓你的DAL使用靜態方法。我一直創建EntityFramework DAL類作爲我的EntityContext的包裝,並在那裏實現了我所有的LINQ和Lambdas。 EntityContext是在我的DAL類構造函數中創建的,我在我的DAL類Dispose()中處理了EntityContext。每個查詢都在一個獨立的方法中實現並返回IQuerable,這樣我就可以鏈接查詢。然後,我可以用我的DAL在我的生意像這樣的代碼:

using(IMyContext context = new MyContext()) 
{ 
    IQueryable<User> query = context.RetrieveUsersByRole("Software Developers"); 

    List<User> developerUsers = query.ToList(); // Query gets executed here 

    foreach(User dev in developerUsers) 
     dev.Salary = 100000000; 

    context.SaveChanges() 
} 

這個心不是確切DDD,但它確實提供了的EntityFramework和業務邏輯之間的分離與允許查詢被重用/鏈接。沒有靜態(我很少使用靜態類/方法)。

編輯:這是工作單位風格的方法,而不是一個CRUD /存儲庫風格的方法。