【问题标题】:Is an assembly that contains a single class overkill?包含单个类的程序集是否矫枉过正?
【发布时间】:2012-06-22 09:58:17
【问题描述】:

我正在编写一个应用程序来承载一系列插件。这些插件一般使用两个库.Common.UI,其中包含插件需要实现的接口等。

我现在正在为插件添加受许可限制的功能。我已经修改了我的主机应用程序,使其只加载定义接口实例 (ILicenseInfoProvider) 的插件并通过 MEF 导出它。那一点没问题。

我们有一个选定的许可代码提供商,他们的许可系统涉及到库的使用。现在,我不想强制每个插件都通过该系统获得许可,并且通过扩展,要求引用该系统的程序集。所以,我打算将引用第三方库的代码放在它自己的程序集中(类似于.Licensing.Vendor)。这样,插件可以简单地添加对该程序集的引用,并包含一个看起来有点像这样的类:

[Export(typeof(ILicenseInfoProvider))]
class MyAssemblyLicenseInfoProvider : BaseVendorLicenseInfoProvider
{ 
    public MyAssemblyLicenseInfoProvider() : base("My Assembly's Product Name")
}

我对这种设置相当满意,除了一件琐碎的事情——.Licensing.Vendor 程序集将只包含一个类,即与正在使用的特定许可系统相关的BaseVendorLicenseInfoProvider

所以,毕竟,我的问题很简单:

把这个类放在它自己的程序集中是不是有点矫枉过正,还是不强制所有插件保存对第三方库的引用的好处值得这样做?

【问题讨论】:

  • 如果这意味着架构和代码对您和您的团队有意义,那很好。除此之外,你把它放在另一个组件中是有意义的,如果你最终需要更多的东西,它会开始变得更少......

标签: c# .net-assembly organization


【解决方案1】:

目前,该程序集有一个合适的目的 - 一个公开可见的程序集,供第三方通过许可进行交互。对我来说似乎完全合理:

  • 即使目前只有一个类,未来可能还会有更多
  • 它是公开可见的,因此您只想提供必要的内容
  • 它封装了合理级别的责任,即许可,而不强制执行特定的实现

【讨论】:

  • 我接受这个,因为它是一个很好的全面答案 - 谢谢。
【解决方案2】:

我投反对票,这并不过分,有些插件可能不需要许可证,有些可能需要..

【讨论】:

    【解决方案3】:

    这取决于您要达到的目标。程序集是一种物理分离代码的方式,而命名空间是一种逻辑分离代码的方式。

    考虑到加载太多程序集(我的意思是一个很大的数字,而不仅仅是几个)可能会对性能造成轻微影响,那么我想您可以考虑是否可以将尽可能多的程序集组合成一个程序集,但通过命名空间将它们分开。但是,如果您觉得将 BaseVendorLicenseInfoProvider 与其他所有内容完全分开确实有意义,那么我也不认为这是一个问题。

    归根结底,一切都是认为是对的,当然每个人都有自己的看法,但只要你有什么对你有用,那么我看不到问题。

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 2013-01-10
      • 2012-06-11
      • 2014-10-31
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多