2012-06-21 94 views
0

我创造与MVC3和MEF的Web应用程序。我试图将我的HostModel导出到带有IDNumber的插件,然后让插件重定向到使用该IDNumber的链接。我的模型没有正确导出,然后我的视图也没有从插件控制器读取模型(我通过创建测试模型对象并将其传递给视图来测试此模型)。我很确定我有一些混淆我如何导出到我的插件中的视图。我正在使用.aspx文件而不是.vbhtml,因为VS2010没有给我这个选项。当我尝试将.vbhtml文件拖入项目时,它无法正常工作。导出/导入问题与MEF

这里是我的HostController:

<Export(GetType(HostModel))> 
<PartCreationPolicy(CreationPolicy.NonShared)> 
Public Class HostController 
    Inherits System.Web.Mvc.Controller 


    Private m_objHost As HostModel 

    Private m_IDNUmber As String 
    Property IDNumber() As String 
     Get 
      Return m_IDNUmber 
     End Get 
     Set(value As String) 
      m_IDNUmber = value 
     End Set 
    End Property 


    Function Index() As ActionResult 
     ViewData("Message") = "Welcome to ASP.NET MVC!" 
     If m_objHost Is Nothing Then 
      m_objHost = New HostModel 
     End If 
     Return View(m_objHost) 
    End Function 

    '<HttpPost()> 
    Function ChangeCUNumber(model As HostModel, strIDNumber As String) As ActionResult 
     ' m_IDNUmber = strIDNumber 
     model.IDNumber = strIDNumber 
     Return View("Index", model) 
    End Function 

    <HttpPost()> 
    Function GoToMini(model As HostModel) As ActionResult 
     m_CUNUmber = model.CUNumber 
     Dim hostContollerObj As New HomeController 
     hostContollerObj.CUNumber = model.IDNumber 

     m_objHost = model 
     Return Redirect("http://localhost:3727/miniView") 
    End Function 
End Class 

这是我HostModel:

Public Class HostModel 
Implements IHost 

Private Shared m_instance As HostModel 
Private m_IDNumber As String 

Public Sub New() 
End Sub 



Shared ReadOnly Property instance() As HostModel 
    Get 
     If m_instance Is Nothing Then 
      m_instance = New HostModel 
     End If 
     Return m_instance 
    End Get 
End Property 


Public Property IDNumber As String Implements CUCMCV_Interfaces.IHost.IDNumber 
    Get 
     Return m_IDNumber 
    End Get 
    Set(value As String) 
     m_IDNumber = value 
    End Set 
End Property 

这是我的插件控制器:

<Export(GetType(IPlugin))> _ 
<ExportMetadata("PluginName", "miniView")> _ 
<PartCreationPolicy(CreationPolicy.NonShared)> _ 
Public Class miniViewController 
    Inherits System.Web.Mvc.Controller 
    Implements IPlugin 


    <Import(GetType(HostModel))> 
    Private m_objHost As HostModel 


    Public Function Index() As ActionResult 
     Dim renderedView As ViewResult = View("~/Plugin/miniView.dll/miniView.Index.aspx", m_objHost) 

     Return renderedView 
    End Function 

这是我的插件视图(Index.aspx的)

Public Class Index 
    Inherits Mvc.ViewPage 




    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 


     Dim p As ImportData = New ImportData() 
     Dim strMINILink As String = "http://inside/mini?ContractNumber=" 
     Dim strCUNumber As String = p.instance.IDNumber 
     Dim strMINIURL As String = strMINILink & strIDNumber 
     Response.Redirect(strMINIURL) 

    End Sub 

End Class 

Public Class ImportData 

    <Import(GetType(HostModel))> 
    Property instance As HostModel 

    Public Sub New() 
     Dim catalog As AggregateCatalog = New AggregateCatalog() 

     catalog.Catalogs.Add(New DirectoryCatalog("C:\Documents and Settings\gbv0860\My Documents\cucmConsolidatedView\CUCMCV\cucmConsolidatedView\cucmConsolidatedView\bin")) 
     Dim _container As CompositionContainer = New CompositionContainer(catalog) 

     Try 
      _container.ComposeParts(Me) 

     Catch ex As Exception 
      Console.WriteLine(ex.ToString) 
     End Try 

    End Sub 
End Class 

任何帮助,将不胜感激!如果你需要我澄清任何事情,请让我知道!谢谢!

回答

1

您已将<Export(GetType(HostModel))>放在HostController类上,实际上它不是HostModel。这不是有效的出口。

ASP.NET MVC将按其确切类型请求控制器,因此您应该导出HostController只需<Export>

<Export(GetType(HostModel))>可能属于在HostModel类。而不是实现你自己的单身人士,你应该用<PartCreationPolicy(CreationPolicy.Shared)>来标记它。

然后有一个事实,你有一个导入ImportData,但该类也不会导出,你只需用new语句自己创建它。因此,MEF永远不会看到这些情况,也不会对进口产品做任何事情。

最后请注意,ASP.NET MVC将不会自动使用MEF创建对象。你需要register a dependency resolver包装一个MEF容器来设置它。 MEF2中似乎有一个composition provider for APS.NET MVC

+0

我最终没有注册依赖关系解析器就开始工作。导入ImportData工作正常。我应该修补那些没有损坏的东西吗? – gblock

+0

@gblock:我现在看到容器是在ImportData类中创建的,我在一读时错过了。这可能会起作用,但会导致为每个请求构建目录。这也意味着你不能直接在HostController类中导入任何东西。 –