【问题标题】:What is the theory behind Microsoft Extensibility Framework's (MEF's) Composable concept?Microsoft 可扩展性框架 (MEF) 可组合概念背后的理论是什么?
【发布时间】:2014-07-24 18:27:59
【问题描述】:

我正在阅读有关构建可组合应用程序的 MSDN 文章:http://msdn.microsoft.com/en-us/magazine/ee291628.aspx。我只是不明白这一点,它似乎只是暴露了一个合同和一堆导入/导出方法,但我不确定如何在实际意义上使用......这与仅仅从第三个继承有什么不同- 政党控制/形式?是否有人可以分享一个实际示例来说明这与仅从第三方控件继承相比有何益处?

【问题讨论】:

    标签: c# .net vb.net


    【解决方案1】:

    MEF 是一个dependency injection 框架。简单解释,我会说它是在运行时扩展您的应用程序。您可以想象,在您编写应用程序之后,有人想要扩展您的应用程序,他可以通过编写自己的应用程序并遵守您的应用程序规定的合同来做到这一点。

    要继承,您需要对事先知道的程序集的引用。这不是 MEF 的情况,它使用合同(接口)并且程序集可以在应用程序中动态加载。然后您就可以开始忘记一遍又一遍地编译以向您的应用程序添加新功能。你开始扩展它...

    这是来自微软的一个很好的教程:How to: Use MEF with MVC

    【讨论】:

    • MEF 不是一个 DI 框架,尽管它可以这样使用。 MEF 旨在用于插件的运行时发现。见:stackoverflow.com/questions/216565/…
    • 感谢您指出这一点。似乎 MEF 处于某种灰色地带。但可以肯定的是,它与 Microsoft 产品(来自 .Net 4)的集成使其成为 DI 的良好候选者,因为您不需要其他任何东西。
    • 没有灰色区域——MEF 并非设计为 IOC 容器。如果您将 MEF 用于 IOC,那么您就是在滥用它。如果您阅读了我提供的链接,Glenn Block(他在微软的 MEF 工作)说的完全一样。
    【解决方案2】:

    我有点明白...这看起来像依赖注入...所以我想传递给 CompositionContainer.ComposeParts() 的所有内容都需要用“Export”属性进行标记。我期望 ComposeParts() 填写的任何内容都需要使用“Import”属性进行标记。所以像这样的事情(愚蠢的例子,但我认为它说明了这一点) 一、参考文献:

    imports System
    imports System.ComponentModel.Composition
    imports System.ComponentModel.Composition.Hosting
    

    现在是代码(注意“导出”属性)

    Public MustInherit Class Place
          Public MustOverride Property Name as String
    End Class
    
    <Export>
    Public Class Library
         Inherits Place  
    
         Public Overrides Property Name as String = "Library"
    End Class
    
    <Export>
    Public Class Home
          Inherits Place
    
        Public Overrides Property Name as String = "Home"
    End Class
    

    现在是“Person”(注意“Export”属性):

    Public MustInherit Class Person
        Public MustOverride Property Name as String
    End Class
    
    <Export>
    Public Class Joe
         Inherits Person
    
         Public Overrides Property Name as String = "Joe"
    End Class
    
    <Export>
    Public Class Bob
         Inherits Person
    
         Public Overrides Property Name as String = "Bob"
    End Class
    

    现在我们可以编写一些有趣的东西(注意“导入”属性 - 这就是注入发生的地方):

    <Export>
    Public Class WhereAmI
      <Import>
      Public person as Person
    
      <Import>
      Public place as Place
    
      Public Sub TellMe()
            Console.WriteLine(person.Name & " is in " & place.Name)
      End Sub
    End Class
    

    现在是可组合的魔法:

    Public Shared Sub Main()
        Dim compositionContainer as new CompositionContainer()
        compositionContainer.ComposeParts(new Bob(), new Library(), new WhereAmI())
        Dim whereAmI as WhereAmI = compositionContainer.GetExportedValueOrDefault(Of WhereAmI)()
        whereAmI.TellMe()    'would print "Bob is in Library"'
    
        Dim compositionContainer2 as new CompositionContainer()
        compositionContainer2.ComposeParts(new Bob(), new Home(), new WhereAmI())
        Dim whereAmI2 as WhereAmI = compositionContainer2.GetExportedValueOrDefault(Of WhereAmI)()
        whereAmI2.TellMe()    'would print "Bob is in Home"'
    End Sub
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2011-01-15
    • 2022-01-10
    相关资源
    最近更新 更多