2012-10-11 32 views
3

當用Java實現的外觀模式,我可以很容易地通過使用包private修飾符隱藏的門面子系統。因此,從外觀/包裝外部只能訪問一個小型界面,其他類別的子系統不可見。如何實現在C#中的門面模式和身體隱藏子系統

正如你已經知道,有在C#中沒有包-private修飾符,但類似一個所謂的內部。根據文檔,定義爲內部的類只能在相同的程序集內訪問

從我unterstand,我要創建至少兩個組件(指實際上兩個.exe/.dll文件)以隱藏門面的子系統在物理。從物理上來講,我的意思是類a)不能從外部實例化,並且b)不能通過門面外的智能感知來顯示。

  1. 我真的必須將我的小型項目拆分爲一個.exe和一個.dll(用於外觀),以便內部關鍵字有效嗎?我的外觀的子系統只包含2個類,一個自己的.dll似乎是矯枉過正的。
  2. 如果是,在Visual Studio中將我的外觀外包給自己的程序集的最佳實踐方法是什麼?

不要誤會我的意思,我沒有真正需要我的程序分成幾個組件。我只是想從智能感知隱藏我的外觀後面的一些類,並防止從外部實例化。但是,如果我沒有錯,那麼沒有更簡單的方法。

+0

一個門面模式背後的理念,按我的理解,就是給一個簡單的界面,需要簡單的功能的客戶端,但仍然可以有更高級的客戶子系統的全部高級功能。爲什麼那麼,你想隱藏子系統? – FishBasketGordo

+0

好的,我的問題不好,忘記了門面模式。我只想隱藏一些課程。或者讓我們說我想把我的外觀變成一個封裝的組件。 – alapeno

+0

程序集可以通過「InternalsVisibleToAttribute」通過「朋友程序集」授予對其內部組件的訪問權限。但是,目前還不清楚你真的想完成什麼,所以我不知道這是否會有所幫助。 –

回答

2

使用單獨的項目是一般的首選方法。事實上,在實現和用戶界面程序集引用的第三個程序集中,通常會有界面或外觀。

這就是說,你可以使用嵌套私人子在一個裝配完成這個任務。

public interface IMyService {} 

public static class MyServiceBuilder 
{ 
    public static IMyService GetMyService() 
    { 
     //Most likely your real implementation has the service stored somewhere 
     return new MyService(); 
    } 

    private sealed class MyService : IMyService 
    { 
     //... 
    } 
} 

外部類實際上成爲您的'包'隱私範圍的目的。你可能不希望這樣做的大'包';在這些情況下,將代碼移動到單獨的程序集並使用內部程序會更簡潔。

請注意,如果您對多個程序集的主要異議是部署,您實際上可以使用merge multiple assemblies來創建更簡單的可執行程序或庫部署。通過這種方式,您可以保留多個項目/程序集的絕緣優勢,而不必擔心可能獨立分發或版本化的多個文件。

+0

我一直很好奇,合併程序集會影響內部關鍵字嗎?也就是說,之前不可用的對象和方法(由於單獨的程序集)突然變得可用嗎? –

+0

@Mystere Man,您仍然有多個由CLR加載的程序集。這只是一個引導程序技巧,允許從單個文件而不是多個文件中提取多個程序集。 –