【发布时间】:2014-07-24 18:27:59
【问题描述】:
我正在阅读有关构建可组合应用程序的 MSDN 文章:http://msdn.microsoft.com/en-us/magazine/ee291628.aspx。我只是不明白这一点,它似乎只是暴露了一个合同和一堆导入/导出方法,但我不确定如何在实际意义上使用......这与仅仅从第三个继承有什么不同- 政党控制/形式?是否有人可以分享一个实际示例来说明这与仅从第三方控件继承相比有何益处?
【问题讨论】:
我正在阅读有关构建可组合应用程序的 MSDN 文章:http://msdn.microsoft.com/en-us/magazine/ee291628.aspx。我只是不明白这一点,它似乎只是暴露了一个合同和一堆导入/导出方法,但我不确定如何在实际意义上使用......这与仅仅从第三个继承有什么不同- 政党控制/形式?是否有人可以分享一个实际示例来说明这与仅从第三方控件继承相比有何益处?
【问题讨论】:
MEF 是一个dependency injection 框架。简单解释,我会说它是在运行时扩展您的应用程序。您可以想象,在您编写应用程序之后,有人想要扩展您的应用程序,他可以通过编写自己的应用程序并遵守您的应用程序规定的合同来做到这一点。
要继承,您需要对事先知道的程序集的引用。这不是 MEF 的情况,它使用合同(接口)并且程序集可以在应用程序中动态加载。然后您就可以开始忘记一遍又一遍地编译以向您的应用程序添加新功能。你开始扩展它...
这是来自微软的一个很好的教程:How to: Use MEF with MVC
【讨论】:
我有点明白...这看起来像依赖注入...所以我想传递给 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
【讨论】: