2011-09-17 46 views
2

我在extensible asp.net mvc 3上使用了一個例子來構建我的可插入應用程序,但是我遇到了一個問題。在一個插件中,我聲明並實現了一個接口。導入不能解決asp.net mvc 3中需要的類型mef

但是,在插件控制器中,當我想使用這個類時,應用程序會拋出一個錯誤,並且似乎EntityConfig沒有被初始化。這怎麼解決?

[Export(typeof(IController)), ExportMetadata("controllerName", "Concept")] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public class ConceptController : Controller 
{ 
    [Import(typeof(IEntityConfig))] 
    private IEntityConfig EntityConfig; 

    public ActionResult Index() 
    { 
    var obs = EntityConfig.EntityName; 
     return View("~/Bin/Views/Concept/Index.cshtml",obs); 
    } 
} 

public interface IEntityConfig 
{ 
    string EntityName { get;} 
} 

[Export(typeof(IEntityConfig))] 
public class TestEntity : IEntityConfig 
{ 
    public string EntityName 
    { 
     get{return "Test";}  
    } 
} 

被修改: 在另一側上,當I是使用this例如,存在在解決EntityConfig沒有問題,但在該視圖中,當我想要加載模型如下:

@using Concepts 
@model Concepts.Models.TestModel 

應用程序會拋出一個錯誤,並告訴我「類型或名稱空間名稱'Concepts'找不到',儘管當我在容器啓動後檢查容器時,我可以在加載的程序集中看到Concepts。

你能幫我嗎? 謝謝。

編輯: 我上傳的樣品:

First one

Second one

編輯(2011/22/09): 我測試上面的代碼上的其他sample該@ Matthew Abbott在他的博客中提供了它的工作原理,儘管這個示例是針對mvc 2.0構建的。

+0

第一次嘗試的確切錯誤以及代碼中的哪一行是拋出的?你如何創建MEF'CompositionContainer'? –

+0

感謝@WimCoenen考慮我的問題。對於第一個示例,我在包含以下內容的行中收到錯誤:「var obs = EntityConfig.EntityName;」錯誤是:「未將對象引用設置爲對象的實例」,用於創建「CompositionContainer」,我使用與示例中包含的代碼相同的代碼。你想讓我上傳嗎? –

+0

你在使用Part1還是Part2? Example-Part2使用CompositeControllerFactory類。你可以查看它的單元測試,看看它的一些可能用法:https://github.com/moodmosaic/System.Web.Mvc.Composition/blob/master/Src/System.Web.Mvc.CompositionUnitTest/CompositeControllerFactoryFacts。 cs –

回答

1

查看你的代碼,你能確定該零件實際上是否被導入?爲您的組合容器構造函數代碼等類

var discoverableControllerFactory = new DiscoverableControllerFactory(
    new CompositionContainer(
     new DirectoryCatalog(extensionsPath)) 
     ); 

你只包括您的擴展路徑作爲目錄。你能guaruntee,你還包括您的基本應用程序路徑,例如:

var discoverableControllerFactory = new DiscoverableControllerFactory(
    new CompositionContainer(
     new AggregateCatalog(
     new DirectoryCatalog("bin"), 
     new DirectoryCatalog(extensionsPath))) 
     ); 

如果您的統一容器實際存在的部位,你可以添加從容器抓住這些部件並將它們允許出口供應商由MEF組成。

至於你的第二個問題,你將需要繼承System.Web.WebPages.Razor.RazorBuildProvider,以確保它包含在你的擴展目錄組件:

namespace ExtensibleMvcApplication 
{ 
    public class CustomRazorBuildProvider : RazorBuildProvider 
    { 
     public static IEnumerable<Assembly> _assemblies; 

     static CustomRazorBuildProvider() 
     { 
      string extensionsPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Extensions"); 

      _assemblies = Directory.GetFiles(extensionsPath, "*.dll") 
       .Select(Assembly.Load); 
     } 

     public override void GenerateCode(System.Web.Compilation.AssemblyBuilder assemblyBuilder) 
     { 
      foreach (var assembly in _assemblies) 
       assemblyBuilder.AddAssemblyReference(assembly); 

      base.GenerateCode(assemblyBuilder); 
     } 
    } 
} 

哪些你需要在你的配置進行註冊:

<buildProviders> 
    <remove extension=".cshtml" /> 
    <add extension=".cshtml" type="ExtensibleMvcApplication.CustomRazorBuildProvider, ExtensibleMvcApplication"/> 
</buildProviders> 
+0

實際上,在第一個示例中,你已經開發了,我使用強類型視圖沒有問題,唯一的問題是'EntityConfig',它不能被啓動。對於第二個示例,我應用了「CustomRazorBuildProvider」並更改了配置文件並更改了「CompositionContainer」,但應用程序拋出了此問題:「無法加載文件或程序集」.Concepts.dll或其某個依賴項「。 –

+0

如果我把它放在我的代碼中,我的錯誤從「是否缺少程序集引用?」改爲「未在〜/ Areas/TestPortal/Views/Demo/Index.cshtml中找到的視圖」 –