我开发了一块被分成多个项目,你能想到的软件:如何隐藏常用的装配类?
- 客户
- 服务器
- 常见
客户机和服务器引用Common,并使用它的类。因此,Common中的类是公共的。但是,尽管我希望它们被客户端和服务器使用,但我不希望它们被使用客户端和服务器库的外部代码使用。
将类标记为内部显然不是一种选择。有没有办法让客户端和服务器可以使用它们,但将它们从外部世界隐藏起来?
我开发了一块被分成多个项目,你能想到的软件:如何隐藏常用的装配类?
客户机和服务器引用Common,并使用它的类。因此,Common中的类是公共的。但是,尽管我希望它们被客户端和服务器使用,但我不希望它们被使用客户端和服务器库的外部代码使用。
将类标记为内部显然不是一种选择。有没有办法让客户端和服务器可以使用它们,但将它们从外部世界隐藏起来?
你资格internal
因为你承担你的其他Assemblies
将无法使用internal
Types
,这未必是真实的。
InternalsVisibleToAttibute
是一个Assembly Attribute
它允许您使其中一个项目的internal
Types
对其他选定的项目可见。
这种方式可以使普通类型internal
但使用此Attribute
使他们服务器和客户可见。
[assembly:InternalsVisibleTo("Client", "PublicKey=2345456456...")]
[assembly:InternalsVisibleTo("Server", "PublicKey=5345347366...")]
在我看来,internal
是通常一个代码味道的一点点... ...它并没有真正保护你的密码尽可能使其更难被后来扩展...我只是不停在Types
public
并使用XML文档,以确保谁使用我的Types
将使用它们作为我的意思是他们一来就可以使用,不过这只是我的观点......
您可以使用internal
类和InternalsVisibleToAttribute
在Common
程序集。将该属性添加到Common
项目的AssemblyInfo
中,并指定将访问其internal
的程序集。
[assembly:InternalsVisibleTo("Client")]
[assembly:InternalsVisibleTo("Server")]
虽然我只是让类型public
。
另一种选择,属性InternalsVisibleTo
的旁边,以这种方式Client
和Server
将有权访问内部类创建Common
项目作为共享项目(在VS 2015提供),因为共享的项目将被包含在它们中的每的组装和不会像Class Library那样移动到单独的程序集中。
不知道这个功能,很有用,谢谢。 –
不错,会阅读更多关于此。 – Gigi
我不同意'internal'是代码味道;有些时候你需要这种封装级别,因为有些类只是作为同一个程序集中的助手类,只会混淆外部用户。 (尽管我同意你的其他解决方案。) – Gigi
这是一个平衡的问题,我只是认为我的代码的可扩展性比让别人阅读我的文档(它也可以声明这个类用于内部用途)更重要,但是这只是我自己的意见:) –
我知道你的意思。在我看来,困扰我的是在智能感知中出现了许多我通常不会使用的类。精心设计的图书馆不应该提供多种方式来做同样的事情(因为这是混淆的常见原因)。 – Gigi