2010-07-16 99 views
2

我有一個公共類,MainObject是在類庫(dll)中,對於這個例子我們將其稱爲BaseLibrary。你可以通過兩層組件訪問一個對象嗎?

我有一個更高級別的類庫,它引用BaseLibrary來訪問它的成員。我們將稱這一個DeviceLibrary。

然後我有一個Windows窗體項目DeviceControl,其中我添加了對DeviceLibrary的引用。

如果我需要使用MainObject對象,我該怎麼做?我知道我可以在DeviceControl項目中添加第二個引用到BaseLibrary,但我只是想知道是否有另一種方式通過DeviceLibrary訪問它?我不確定這裏的封裝規則是什麼...

回答

1

您在代碼中引用的任何類型都必須是直接引用程序集的一部分。

雖然通常不實用,但您可以使用MainObject而不直接引用它,而是使用System.Object引用,並使用Reflection調用其成員。在C#4.0中,你可能只使用dynamic關鍵字:

dynamic x = MethodReturningAMainObject(); 
x.Foo(); //this will be compiled to use reflection to find "Foo" 

除了使用動態或object參考,您可以使用適用於MainObject任何暴露的基類或接口。

+0

你可以使用動態,但你(幾乎肯定)不想。 – apollodude217 2010-07-16 18:27:46

0

聲明:這並沒有完全解決您的問題。

通常在N層設計中,「模型」跨越所有圖層。下面是我在設計時參考的一個圖表:http://i.msdn.microsoft.com/cc700340.fig01_L(en-us).gif

我不確定BaseLibrary包含哪些內容,但似乎您可能必須從DeviceLibrary中引用它。

+0

有用的圖表,你有鏈接到原來的上下文嗎? – Paolo 2010-07-16 12:30:50

+0

@Paolo http://msdn.microsoft.com/en-us/magazine/cc700340.aspx – 2010-07-16 13:09:07

1

如果你能夠改變庫組件的內容(即它是你的代碼),那麼你既可以:

  1. 移動MainObject到一個單獨的參考組裝和任何現有的組件參考它。如果MainObject實際上並不依賴於BaseLibrary的其他內容,這很好。

  2. 摘自MainObject的接口,並把,在每一個其它組件可引用一個參考庫。然後,您是否對代碼進行了編碼,您只需要引用新的參考庫。

如果你不能改變庫組件的內容,你可以採取書面MainObject一個包裝對象,用它自己的接口和提取接口的參考庫中選擇2

3

添加引用。如果你不這樣做,那麼編譯器會抱怨並告訴你添加引用。使用反射hacks應該是一個非常遙遠的第二選擇,它只會讓你的代碼變慢,並且不會去除DLL上的運行時依賴。