我有兩個類庫項目:DataAccessLibrary
和ServiceLayerLibrary
。 ServiceLayerLibrary
需要訪問DataAccessLibrary
的方法和屬性,但其他項目不能訪問DataAccessLibrary
。訪問類庫中的方法和屬性,但有限制
我該如何做到這一點?
我有兩個類庫項目:DataAccessLibrary
和ServiceLayerLibrary
。 ServiceLayerLibrary
需要訪問DataAccessLibrary
的方法和屬性,但其他項目不能訪問DataAccessLibrary
。訪問類庫中的方法和屬性,但有限制
我該如何做到這一點?
讓您的會員進入DataAcceessLibrary internal
並使用friend assemblies,以便ServiceLibrary可以訪問它們。
內部關鍵字(在C#中)允許訪問同一程序集內的其他類。朋友是VB.Net中的等效關鍵字。然而,如果你想讓另一個程序集有權訪問另一個程序集的「內部」東西(用C#),那麼你可以使用下面稱爲「Friend Assemblies」的Web鏈接的方法,它將一個程序集的「內部」東西暴露給另一個程序集。在這個過程中沒有任何地方你真的使用關鍵字朋友或在C#中友好。這就是他們稱之爲這種關係的地方,你說[assembly:InternalsVisibleTo(「MyAssembly」)]。如果您有一個程序集利用另一個不想公開的程序集的功能,則此功能非常有用。你也可以像這樣[assembly:InternalsVisibleTo(「MyAssembly,PublicKey = xXxXx」)]這樣的強命名程序集中使用這種技術。
例子:
using System.Runtime.CompilerServices;
using System;
[assembly: InternalsVisibleTo("ServiceLibrary")]
// The class is internal by default.
class FriendClass
{
public void Test()
{
Console.WriteLine("Sample Class");
}
}
// Public class that has an internal method.
public class ClassWithFriendMethod
{
internal void Test()
{
Console.WriteLine("Sample Method");
}
}
你也可以使用an alternative signing approach如果需要公共成員在DataAccessLibrary這可能是更好的。可以通過使用帶有StrongNameIdentityPermission的LinkCommand來實現(參見http://www.codeproject.com/Articles/339909/Limiting-the-accessibility-Another-way-of-Friend-A)。
首先,您可能想知道是否確實需要通過編譯時或運行時檢查來確保正確訪問DataAccessLibrary。也許規定它在編碼準則和標準中的正確使用就足夠了 - 然後相信開發者遵循這些準則。然後再次,我不知道你的情況:-)
其次,你可能想知道是否真的有必要創建單獨的項目。您可能只是將DataAccessLibrary作爲ServiceLayerLibrary中的內部類實現,然後它們不會暴露給外部世界。
如果你不想這樣做,那麼你可以讓DataAccessLibrary的public
方法internal
然後狀態的可見像這樣:
[assembly: InternalsVisibleTo("ServiceLayerLibrary")]
無論是乾淨與否是由你。就我個人而言,我不喜歡這樣的結構。