2009-09-29 55 views
1

這可能不是所有可能的,但我想我會在放棄這個想法之前得到你的迴應。C#類的方法只能從某些項目調用嗎?

我們都在一個解決方案中3個主要項目:界面,邏輯和數據訪問。 數據訪問項目包含所有對象類及其變量和方法。 邏輯項目包含保存邏輯方法的類以及處理從數據訪問項目中保存和加載對象的2個類。 Interface項目是用戶界面,任何需要在此/不需要在邏輯層中的類和方法。

我們打算保持清醒的分離,並保持接口的通信 - >邏輯 - >數據訪問和備份相同的方式。這一切都很好,但不幸的是,對於Interface來理解數據訪問類對象通過它的值傳遞回來,我們顯然需要在接口項目中添加對數據訪問項目的引用。

希望我還沒有失去任何人?

現在很明顯,我們都很好用,允許接口來讀取數據訪問項目的價值,但我們不希望接口調用項目的任何方法,因爲這些都是通過以特定的方式邏輯層處理。我知道這只是一個設計時間問題,但無論如何,我們可以將方法設置爲不能從某些項目調用?我們不想捕獲什麼項目在運行時調用方法,因爲這太遲了。

這可能聽起來像是一個矯枉過正的問題,但由於我的同事和我可能不是唯一的開發人員,在將其發佈給公司後,我們希望任何其他開發人員遵循該解決方案和項目的嚴格準則和結構。我們可以把它寫下來,並儘量確保他們在編寫應用程序之前閱讀它,但正如我們都知道,如果迫切要求您開展某些工作,並不能保證您有時間閱讀其他開發人員技術關於應用程序的規範首先。

如果您需要了解更多信息拿出任何解決方案,請詢問路程。

非常感謝所有,

路易·羅素

回答

0

我通常不會推薦這一點,但你總是可以添加一個調試時間檢查看着StackTrace以查看父級別對象是什麼。基本上,你會走上去,直到你遇到上面的級別(通過檢查相關類型的程序集) - 如果你沒有遇到它(即你到達頂級程序集),那麼你會拋出一個異常。

原因僅此是調試,是你不想與什麼是有效的冗餘代碼負擔你的發佈應用程序。

1

您可以使用InternalVisibleTo屬性,並標記爲要限制訪問internal方法。

注意:就你而言,我不會使用它。我寧願重新考慮設計。您的域對象位於「數據訪問項目」中似乎有點奇怪。爲什麼你沒有UI項目,邏輯項目,數據訪問項目和模型項目?

0

也許最好把這些接口放在邏輯項目中?如果你看看像領域驅動設計這樣的一些思想流派,數據訪問的接口(在DDD案例庫接口中)實際上是域(或稱邏輯)關注的一部分(而不是數據層),並且經常以一個不同的項目。

1

您可以將數據存儲類(即傳遞的類)抽象爲由數據訪問和接口項目引用的單獨項目。然後,您可以從接口項目中刪除數據訪問項目引用。

1

您的問題出現是因爲您允許頂層(用戶界面)從底層(數據訪問)引用類型。 不要這樣做。

而是定義一些用戶界面應該編程的抽象(接口或基類)。您可以將這些抽象放在邏輯層或新庫中。

您的數據訪問庫應該執行那些抽象。

您可以使用依賴注入(DI)在運行時將實際的數據訪問庫注入用戶界面,而實際上在這兩者之間沒有任何硬引用。

這可以手動完成,也可以通過使用DI容器(如Castle Windsor)來連接依賴關係。