Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 微软可扩展性框架背后的理论是什么;s(MEF';s)可组合概念?_C#_.net_Vb.net - Fatal编程技术网

C# 微软可扩展性框架背后的理论是什么;s(MEF';s)可组合概念?

C# 微软可扩展性框架背后的理论是什么;s(MEF';s)可组合概念?,c#,.net,vb.net,C#,.net,Vb.net,我正在阅读有关构建可组合应用程序的MSDN文章:。我只是不明白,它似乎只是暴露了一个合同和一系列的进口/出口方法,但我不知道如何在实际意义上使用。。。这与仅仅从第三方控件/表单继承有什么不同?是否有人可以分享一个实际的例子来阐明这与仅仅从第三方控制继承相比是如何有益的?MEF是一个框架。简单地说,我想说的是在运行时扩展应用程序。您可以想象,在您编写应用程序之后,有人想要扩展您的应用程序,他可以通过编写自己的应用程序并遵守您的应用程序指定的合同来实现 要继承,您需要对预先知道的程序集的引用。MEF

我正在阅读有关构建可组合应用程序的MSDN文章:。我只是不明白,它似乎只是暴露了一个合同和一系列的进口/出口方法,但我不知道如何在实际意义上使用。。。这与仅仅从第三方控件/表单继承有什么不同?是否有人可以分享一个实际的例子来阐明这与仅仅从第三方控制继承相比是如何有益的?

MEF是一个框架。简单地说,我想说的是在运行时扩展应用程序。您可以想象,在您编写应用程序之后,有人想要扩展您的应用程序,他可以通过编写自己的应用程序并遵守您的应用程序指定的合同来实现

要继承,您需要对预先知道的程序集的引用。MEF的情况并非如此,它使用契约(一个接口),并且可以在应用程序中动态加载程序集。然后,您就可以开始忘记一遍又一遍地编译以向应用程序添加新功能。您开始扩展它


这里有一个来自微软的好教程:

我有点明白了。。。这看起来像依赖注入。。。因此,我要传递给CompositionContainer.ComposeParts()的所有内容都需要标记为“Export”属性。我希望ComposeParts()填写的任何内容都需要标记为“Import”属性。类似这样的例子(愚蠢的例子,但我认为它说明了这一点) 首先,参考文献:

imports System
imports System.ComponentModel.Composition
imports System.ComponentModel.Composition.Hosting
现在是代码(注意“Export”属性)


MEF不是DI框架,尽管它也可以这样使用。MEF用于插件的运行时发现。请看:谢谢你指出这一点。MEF似乎处于一种灰色地带。但可以肯定的是,它与Microsoft产品(来自.Net 4)的集成使它成为DI的一个很好的候选产品,因为您不需要任何其他东西。没有灰色地带——MEF不是设计为IOC容器的。如果你把MEF用于国际奥委会,那你就是在滥用它。如果你阅读我提供的链接,Glenn Block(在微软从事MEF工作)也会说同样的话。MEF不是DI框架。
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
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