根据引用程序集限制哪些属性可用

Posted

技术标签:

【中文标题】根据引用程序集限制哪些属性可用【英文标题】:Limit which attributes are available based on referencing assembly 【发布时间】:2018-06-04 11:58:38 【问题描述】:

我可能没有正确地表达这个问题,但希望我能理解这个意图。

我有一个包含三个项目的应用程序。项目 1 是应用程序的面向 Web 的部分。项目 2 是用于访问信息的 API。项目3是访问数据库获取信息的部分,并将该信息返回给调用者。

从项目 1 开始,我调用项目 3 中对象中包含的方法,以便访问/修改信息以在网站上使用。因此,例如,从项目 1 中,我将调用 Project3.classes.myObject.getObject(2) 以根据 objectID 2 的数据库查询获取 myObject 的实例。

myObject 有一大堆我在项目 1 中使用的属性。这些属性不一定都在网站上可见,许多属性在项目 1 内部使用。

现在,从项目 2 开始,我希望能够通过 API 调用返回此信息。例如,使用 /controllers/myObject/2 调用 API 也会调用 Project3.classes.myObject.getObject(2)。但是当我从项目 2 中调用时,我想限制返回的属性。

我知道我可以通过在项目 2 中包装返回的对象来实现这一点,并以这种方式限制 API 调用实际返回的内容。但是,有什么方法可以让我在 Project 3 中完成这项工作?

我知道,当我将属性声明为“公共”时,任何调用它的程序集都可以使用它,并且我知道如果我将其设为“内部”,它只能用于包含的程序集。有没有我可以使用的修饰符,而不是调用它的“任何”程序集,只有特定的程序集?

还是我的想法完全错误?

【问题讨论】:

【参考方案1】:

好像你在谈论添加属性

[assembly:InternalsVisibleTo(Project1)]

到 Project3 AssemblyInfo.cs

接下来将所有应该对 Project1 可见但对 Project2 不可见的道具设置为 internal

话虽如此,我真的不认为这是一个好的设计,尽管我已经看到它在现实世界的 API 中使用。其目的是在 API 的 DLL 之间共享一些功能,同时对第三方应用隐藏它。

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute(v=vs.110).aspx

【讨论】:

听起来这正是我正在寻找的。不过,您能否澄清一下,为什么您认为这不是好的设计? 我认为它只会让代码变得非常不清楚并且难以维护。 Internal 旨在将内容保存在内部,我认为此属性最初是用于内部类的单元测试。只需为不同的用途和工厂创建 2 个接口,并将整个实现保持在内部,就更清楚了。

以上是关于根据引用程序集限制哪些属性可用的主要内容,如果未能解决你的问题,请参考以下文章

仅在 Windows Mobile/CE 上可用的引用程序集

项目中引用的程序集名称但相同版本不可用

在 Visual Studio 2013 中,如何将代码分析限制为我的代码而不是引用的程序集?

Visual Studio 8 中程序集引用的 Aliases 属性有啥用

访问修饰符 程序集 静态方法

程序集引用的“特定版本”属性在 Visual Studio 中究竟是如何工作的?