【问题标题】: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 中完成这项工作?

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

还是我的想法完全错误?

【问题讨论】:

    标签: .net .net-assembly visibility api-design


    【解决方案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 个接口,并将整个实现保持在内部,就更清楚了。
    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2015-11-07
    相关资源
    最近更新 更多