1

我有两个类库项目:DataAccessLibraryServiceLayerLibrary. ServiceLayerLibrary需要访问DataAccessLibrary的方法和属性,但其他项目不能访问DataAccessLibrary.

我怎样才能做到这一点?

4

2 回答 2

3

首先,您可能想知道是否真的需要通过编译时或运行时检查来确保正确访问 DataAccessLibrary。也许在编码指南和标准中规定其正确使用就足够了——然后相信开发人员会遵循这些指南。再说一次,我不知道你的情况:-)

其次,您可能想知道是否真的有必要创建单独的项目。您可能只是将 DataAccessLibrary 实现为 ServiceLayerLibrary 中的内部类,然后它们就不会暴露给外界。

如果您不想这样做,那么您可以制作 DataAccessLibrary 的public方法internal,然后像这样声明可见性:

[assembly: InternalsVisibleTo("ServiceLayerLibrary")]

这是否干净取决于您。就我个人而言,我不喜欢这种结构。

于 2013-01-09T10:56:24.640 回答
2

让您的成员在 DataAcceessLibrary 中internal并使用朋友程序集,以便 ServiceLibrary 可以访问它们。

internal 关键字(在 C# 中)允许访问同一程序集中的其他类。Friend 是 VB.Net 中的等效关键字。但是,如果您希望另一个程序集可以访问另一个程序集的“内部”内容(在 C# 中),那么您可以使用下面名为“Friend Assemblies”的 Web 链接中的方法,它将一个程序集的“内部”内容公开给另一个程序集. 在此过程中,您实际上没有在 C# 中使用关键字friend 或friendly。这就是他们所说的这种关系,你说的是 [assembly:InternalsVisibleTo("MyAssembly")]。这在您有一个程序集利用您不想公开的另一个程序集的功能的情况下很有用。您还可以将此技术与强命名程序集一起使用,例如 [assembly: InternalsVisibleTo("MyAssembly,

例子:

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 中的公共成员,您也可以使用另一种签名方法,这可能会更好。它可以通过使用带有 StrongNameIdentityPermission 的 LinkCommand 来实现(参见http://www.codeproject.com/Articles/339909/Limiting-the-accessibility-Another-way-of-Friend-A)。

于 2013-01-09T10:52:04.347 回答