Asp.net mvc 组成非';t由执行作文的班级导入?

Asp.net mvc 组成非';t由执行作文的班级导入?,asp.net-mvc,mef,composition,Asp.net Mvc,Mef,Composition,我有一个ASP.NETMVC应用程序,它使用MEF实现插件框架。插件是存在于应用程序bin目录中的独立DLL。插件通常像这样导出一个或多个控制器 <Export(GetType(IController))> <MYAPP_Interfaces.Attributes.MVCPluginMetadata( "SomePlugin", "A Description for the plugin", "A Readable Name", {"Script

我有一个ASP.NETMVC应用程序,它使用MEF实现插件框架。插件是存在于应用程序bin目录中的独立DLL。插件通常像这样导出一个或多个控制器

<Export(GetType(IController))>
<MYAPP_Interfaces.Attributes.MVCPluginMetadata(
    "SomePlugin",
    "A Description for the plugin",
    "A Readable Name",
    {"ScriptsForThePlugin.js"},
    {"StylesForThePlugin.css"},
    Enumerations.MVCPluginType.DataView,
    "DefaultActionName")>
<PartCreationPolicy(CreationPolicy.NonShared)>
Public Class MyPluginController
     Inherits System.Web.Mvc.Controller

    <Import()>
    Private m_objHost As IWebHost
因此,我的主要问题可以分为两部分:

  • 如果有20个左右的类在实例化时执行组合,是否存在明显的性能问题?我目前只有几个,如果有一个打击,它是不明显的换句话说,我真的需要改变这个策略吗?这违反了DRY,因为我在每个类中都有一个
    Compose
    方法,但我可以学会适应它

  • 有更好的方法吗?我如何处理主应用程序中的单个组合,以填充插件中的所有类,包括执行主组合的类中未导入的类

  • 我考虑了以下几点:

    • 让所有模型和实用程序类以及实现标记接口的任何类都将它们作为契约使用该接口导出,并将它们导入宿主类,即使宿主类不需要它们。我认为这是一个比我拥有的更粗糙的设计,我不想这样做。不过,我愿意听取支持这一点的观点

    • 在每个需要它的插件中都有一个类,它实现了
      IWebHost
      ,充当主应用程序导出的类的包装器。我仍然需要在每个插件中进行合成,但至少每个插件只能进行一次。我觉得这个没问题


    提前感谢您提供的任何帮助,感谢您阅读了这本关于一个问题的小说。

    我最后向需要它的插件添加了一个类似下面的类。我有一个插件的项目模板,所以我可能只是将这个类添加到该模板中

    任何需要来自主机的类都可以通过调用
    PluginUtility.host
    来访问它

    Public Class PluginUtility
    
        <Import()>
        Private m_objHost As IWebHost
    
        Private Shared m_objInstance As PluginUtility
    
        Private Sub New()
           Compose()
        End Sub
    
        Public Shared ReadOnly Property Host As IWebHost
            Get
                If m_objInstance Is Nothing Then
                    m_objInstance = New PluginUtility
                End If
                Return m_objInstance.m_objHost
            End Get
        End Property
    
        Private Sub Compose()
            Try
                Dim objCatalog As New AggregateCatalog
                objCatalog.Catalogs.Add(New DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory & "bin"))
                Dim container As New CompositionContainer(objCatalog)
            container.ComposeParts(Me)
            Catch ex As Exception
                Console.Write("Could not compose to get a reference to the host")
            End Try
        End Sub
    End Class
    
    公共类插件功能
    作为IWebHost的专用m_对象主机
    作为插件的私有共享m_对象
    私人分新
    撰写()
    端接头
    作为IWebHost的公共共享只读属性主机
    得到
    如果m_objInstance不算什么,那么
    m_objInstance=新的插件功能
    如果结束
    返回m_objInstance.m_objHost
    结束
    端属性
    私有子组件()
    尝试
    Dim objCatalog作为新的聚合Catalog
    objCatalog.Catalogs.Add(新目录目录(AppDomain.CurrentDomain.BaseDirectory&“bin”))
    Dim容器作为新的合成容器(objCatalog)
    容器组件(Me)
    特例
    编写(“无法编写以获取对主机的引用”)
    结束尝试
    端接头
    末级
    
    Public Class PluginUtility
    
        <Import()>
        Private m_objHost As IWebHost
    
        Private Shared m_objInstance As PluginUtility
    
        Private Sub New()
           Compose()
        End Sub
    
        Public Shared ReadOnly Property Host As IWebHost
            Get
                If m_objInstance Is Nothing Then
                    m_objInstance = New PluginUtility
                End If
                Return m_objInstance.m_objHost
            End Get
        End Property
    
        Private Sub Compose()
            Try
                Dim objCatalog As New AggregateCatalog
                objCatalog.Catalogs.Add(New DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory & "bin"))
                Dim container As New CompositionContainer(objCatalog)
            container.ComposeParts(Me)
            Catch ex As Exception
                Console.Write("Could not compose to get a reference to the host")
            End Try
        End Sub
    End Class