我有两个类库项目:DataAccessLibrary
和ServiceLayerLibrary
。
ServiceLayerLibrary
需要访问DataAccessLibrary
的方法和属性,但其他项目必须无法访问DataAccessLibrary
。
我怎样才能做到这一点?
答案 0 :(得分:3)
首先,您可能想知道是否确实需要通过执行编译时或运行时检查来确保正确访问DataAccessLibrary。也许规定它在编码指南和标准中的正确使用就足够了 - 然后相信开发人员遵循这些指导原则。然后,我不知道你的情况: - )
其次,您可能想知道是否真的有必要创建单独的项目。您可以将DataAccessLibrary实现为ServiceLayerLibrary中的内部类,然后它们不会暴露给外部世界。
如果您不想这样做,那么您可以制作DataAccessLibrary的public
方法internal
,然后声明可见性:
[assembly: InternalsVisibleTo("ServiceLayerLibrary")]
这是否干净取决于你。就个人而言,我不是这种结构的粉丝。
答案 1 :(得分:2)
让您的成员加入DataAcceessLibrary internal
并使用friend assemblies,以便ServiceLibrary可以访问它们。
internal关键字(在C#中)允许访问同一程序集中的其他类。 Friend是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");
}
}
如果您需要DataAccessLibrary中的公共成员,也可以使用an alternative signing approach,这可能会更好。可以通过将LinkCommand与StrongNameIdentityPermission一起使用来实现(参见http://www.codeproject.com/Articles/339909/Limiting-the-accessibility-Another-way-of-Friend-A)。