对类库中方法和属性的访问有限制
本文关键字:访问 有限制 属性 类库 方法 | 更新日期: 2023-09-27 17:51:14
我有两个类库项目:DataAccessLibrary
和ServiceLayerLibrary
。ServiceLayerLibrary
需要访问DataAccessLibrary
的方法和属性,但其他项目不能访问DataAccessLibrary
。
我怎样才能做到这一点?
首先,您可能想知道是否真的需要通过执行编译时或运行时检查来确保正确访问DataAccessLibrary。也许在编码指南和标准中规定它的正确使用就足够了——然后相信开发人员会遵循这些指南。不过,我不知道你的情况:-)
第二,你可能想知道是否真的有必要创建单独的项目。你可以在ServiceLayerLibrary中实现DataAccessLibrary作为内部类,这样它们就不会暴露给外部世界。
如果你不想这样做,那么你可以让DataAccessLibrary的public
方法internal
,然后像这样状态可见性:
[assembly: InternalsVisibleTo("ServiceLayerLibrary")]
那是否干净取决于你。我个人不喜欢这种结构。
让你的成员在DataAcceessLibrary internal
中,并使用友元程序集,以便ServiceLibrary可以访问它们。
内部关键字(在c#中)允许访问同一程序集中的其他类。Friend是VB.Net中的等效关键字。然而,如果你想让另一个程序集访问另一个程序集的"内部"内容(在c#中),那么你可以使用下面的web链接中的方法,称为"朋友程序集",它将一个程序集的"内部"内容暴露给另一个程序集。在这个过程中,您实际上没有在c#中使用关键字friend或friendly。这只是他们所说的这种关系,你说[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");
}
}
您还可以使用另一种签名方法,如果您需要DataAccessLibrary中的公共成员,这种方法可能会更好。它可以通过使用LinkCommand与StrongNameIdentityPermission(见http://www.codeproject.com/Articles/339909/Limiting-the-accessibility-Another-way-of-Friend-A)来实现。