代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何在棱镜中松散地引用模块,使它们能够或不能存在?

  •  2
  • Edward Tanguay  · 技术社区  · 16 年前

    this stackoverflow question 我知道了 棱镜/统一体并不像我想象的那样分离。 例如,如果我有这个类,它将menumanager注入到它的构造函数中,那么我必须 确保 这门课实际上 存在于某个地方 (我认为您可以只提取包含类的.dll,容器会处理它,例如在其位置插入一个空值):

    public class EmployeesPresenter
    {
        public EmployeesPresenter(IMenuManager menuManager)
        {
    
        }
    }
    

    但是我可以处理这个问题:如果没有menumodule,应用程序就无法运行(或者,正如我建议的那样,我可以有一个 零素模 它只会阻止应用程序中断。

    但是,我正在构建的应用程序将具有 menumanager类 在菜单模块中,每个模块都必须在菜单管理器中注册它想要的所有内容。但是,我想 交换菜单模块 例如有 基础设施模块 并且有一个 电视菜单模块 等。

    但是,当我在例如CustomersModule中时,为了使用TelerikmenuModule, 我需要参考一下 . 当我想使用基础设施模块时,我需要参考它。

    那么,我如何能够在不使用新引用重新编译所有模块的情况下,使用基础设施模块对telerikmenumodule进行“热交换” ,例如,我想替换:

    Application.exe
    Customers.dll
    TelerikMenuModule.dll
    

    用这个:

    Application.exe
    Customers.dll
    InfragisticsMenuModule.dll
    

    并且只需重新启动应用程序,它就可以使用新的infragismenumodule.dll和 不抱怨telerikmenumodule.dll不再存在 .

    2 回复  |  直到 16 年前
        1
  •  5
  •   Daniel Earwicker    16 年前

    这就是接口出现的地方。你需要这样的东西:

    public interface IMenuSystem
    {
        // whatever operations need to be offered by a menu system
    }
    

    Application.exe Customers.dll 只能引用该接口。他们不允许了解特定的实现。

    然后使用配置步骤(调用 Register... 方法或使用配置文件)指定将提供 MenuSystem .

        2
  •  2
  •   Jimmy Chandra    16 年前

    很明显,这里我们想到了MEF,它是为这样的东西设计的。我还没有机会使用Unity,所以我不确定它是否有这样的内置功能(即扫描目录中的IMemodule实现),但是MEF可以做到这一点。

    建议还将这个IMENUModule放在一个公共程序集中(与其他程序集分开)。我通常把它叫做something.core.dll。

    所以您可能有:application.exe、customer.dll、application.core.dll和特定的menumodule实现。

    您的特定menumodule实现将引用application.core程序集,以访问其menumodule接口并在那里实现它。

    推荐文章