2015-12-25 39 views
2

我开发了一块被分成多个项目,你能想到的软件:如何隐藏常用的装配类?

  • 客户
  • 服务器
  • 常见

客户机和服务器引用Common,并使用它的类。因此,Common中的类是公共的。但是,尽管我希望它们被客户端和服务器使用,但我不希望它们被使用客户端和服务器库的外部代码使用。

将类标记为内部显然不是一种选择。有没有办法让客户端和服务器可以使用它们,但将它们从外部世界隐藏起来?

回答

3

你资格internal因为你承担你的其他Assemblies将无法​​使用internalTypes,这未必是真实的。

InternalsVisibleToAttibute是一个Assembly Attribute它允许您使其中一个项目的internalTypes对其他选定的项目可见。

这种方式可以使普通类型internal但使用此Attribute使他们服务器客户可见。

[assembly:InternalsVisibleTo("Client", "PublicKey=2345456456...")] 
[assembly:InternalsVisibleTo("Server", "PublicKey=5345347366...")] 

在我看来,internal是通常一个代码味道的一点点... ...它并没有真正保护你的密码尽可能使其更难被后来扩展...我只是不停在Typespublic并使用XML文档,以确保谁使用我的Types将使用它们作为我的意思是他们一来就可以使用,不过这只是我的观点......

+4

我不同意'internal'是代码味道;有些时候你需要这种封装级别,因为有些类只是作为同一个程序集中的助手类,只会混淆外部用户。 (尽管我同意你的其他解决方案。) – Gigi

+0

这是一个平衡的问题,我只是认为我的代码的可扩展性比让别人阅读我的文档(它也可以声明这个类用于内部用途)更重要,但是这只是我自己的意见:) –

+0

我知道你的意思。在我看来,困扰我的是在智能感知中出现了许多我通常不会使用的类。精心设计的图书馆不应该提供多种方式来做同样的事情(因为这是混淆的常见原因)。 – Gigi

1

您可以使用internal类和InternalsVisibleToAttributeCommon程序集。将该属性添加到Common项目的AssemblyInfo中,并指定将访问其internal的程序集。

[assembly:InternalsVisibleTo("Client")] 
[assembly:InternalsVisibleTo("Server")] 

虽然我只是让类型public

3

另一种选择,属性InternalsVisibleTo的旁边,以这种方式ClientServer将有权访问内部类创建Common项目作为共享项目(在VS 2015提供),因为共享的项目将被包含在它们中的每的组装和不会像Class Library那样移动到单独的程序集中。

+0

不知道这个功能,很有用,谢谢。 –

+0

不错,会阅读更多关于此。 – Gigi