【问题标题】:Internal method code reuse内部方法代码重用
【发布时间】:2010-12-13 05:44:10
【问题描述】:

假设您有 2 个完全独立的项目:项目 1 和项目 2。一个是 Windows 应用程序,一个是 Web 应用程序。

如果两个项目都需要类 A、B 和 C 供自己内部使用,那么在两个项目之间的类中促进代码重用的最佳方式是什么(尤其是在代码更新时)随着时间的推移)?

  • 强制将类公开,破坏整洁的公共接口并从一个项目引用另一个项目(糟糕!)
  • 为共享组件创建第三个项目,然后仅在内部将它们用于主要项目(糟糕!)
  • 将项目 1 中的类“添加”到项目 2(超出项目文件夹)并接受项目 2 不会在其项目文件夹中包含它需要构建的所有类(可以接受,但不理想)
  • 依赖于复制粘贴、源代码控制交叉引用或其他一些非编程噱头。
  • 目前我还没有掌握其他一些技术(手指交叉...)

请注意,这些是两个项目所必需的相同的 INTERNAL 辅助类。

【问题讨论】:

    标签: c# code-reuse internal


    【解决方案1】:

    您可以将InternalsVisibleTo assembly attribute 用于朋友程序集,允许程序集访问在另一个程序集中标记为internal 的类型和成员。

    【讨论】:

    • 哇。我从来没有听说过这个,但它看起来正是我需要的东西。你每天都能学到一些东西!
    • 太棒了。效果很好,而且比我预期的要容易得多。 +1 并接受。谢谢,约翰!
    【解决方案2】:

    通常使用类库项目实现,需要第三个项目(类库类型)。

    类库项目具有 .dll 扩展名的输出,任何其他 .NET 项目(以任何语言编写)都可以使用它。要使用 dll,请添加对文件的引用,然后将

    using the_namespace_of_dll

    这是绝对的解决方案

    【讨论】:

      【解决方案3】:

      我通常使用单独的解决方案(包含测试)并添加参考。然后我在最后使用ILMerge 不公开单独的DLL(到目前为止这对我来说还可以)。 John Rasch 指出的方法可以结合使用以防止“它”被暴露,尽管我通常在信任用户/其他开发人员方面犯了错误。

      我 [几乎] 不惜一切代价避免复制粘贴。 SCM 方法可以工作,但并不真正强制开发 ABI,并且在不同的 SCM 中没有得到很好的支持。除非一种解决方案是“所有者”,否则没有帮助的 SVN 非常糟糕;那么外部环境就可以了。

      【讨论】:

        【解决方案4】:

        对于任何访问此页面并希望做同样事情的人,我发现这个更深入的解释非常清晰:

        http://dotnetstep.blogspot.com/2009/01/internalsvisibleto-attribute-usage.html

        【讨论】:

          【解决方案5】:

          将代码添加到一个项目,然后add it to the other as a link。然后你不必担心“InternalsVisibleTo”——它就在那里。两个项目(或任意数量的项目)的代码是同一个文件。

          不要害怕编辑 XML .cs​​proj 文件。例如,这行得通...

          <Compile Include="$(Codez)\z.Libraries\diff-match-patch\DiffMatchPatch\**\*.cs"
          Exclude="NotThisOne.cs;**\NotThisFolderWith\This*.cs">
          <Link>Libs\%(RecursiveDir)%(Filename)%(Extension)</Link>
          </Compile>
          

          ...并将源文件夹和子文件夹中的所有 C# 文件作为链接文件提供给您的目标项目中名为 \Libs\ 的文件夹中。

          • $(Codez) 是我在 PC 上使用的 Windows 环境变量。
          • 我也可以在末尾使用*.* 而不是*.cs
          • 这是 Visual Studio 可能会破坏您的其中一项内容,将文件添加到充满通配符链接文件的文件夹中可能会将它们分解为单独的条目。或不。取决于风。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-08-08
            • 2021-08-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-14
            • 1970-01-01
            相关资源
            最近更新 更多