2017-05-31 10 views
1

現在、外部アセンブリから埋め込みViewComponentsを読み込もうとしています。なぜasp.netコアmvc​​のEmbeddedFileProviderに埋め込みファイルが見つかりませんか?

私は私のプロジェクトファイルでこれを含めました:

<EmbeddedResource Include="Views\**\*.cshtml" /> 

ので、私は、実際の組み立てと実行GetManifestResourceNamesを検査するとき()私は、ファイルが埋め込まれていることがわかります。

私はその後Startup.csにConfigureService()でこのメソッドを呼び出しています:これがすべてでは動作しませんように私も

mvcBuilder.Services.Configure<RazorViewEngineOptions>(o => { o.FileProviders.Add(compositeFileProvider); });

を使用していない

public static IMvcBuilder GetModules(this IMvcBuilder mvcBuilder) 
    { 
     var embeddedFileProviders = new List<EmbeddedFileProvider> 
     { 
      new EmbeddedFileProvider(Assembly.GetCallingAssembly()) 
     }; 

     mvcBuilder.ConfigureApplicationPartManager(apm => 
     { 
      foreach (string modulePath in Directory.GetFiles(Configuration.Settings.Path, "*.Module.dll")) 
      { 
       var assembly = Assembly.LoadFrom(modulePath); 
       var startUpType = (from t in assembly.GetTypes() 
            where t.GetInterfaces().Contains(typeof(IModuleStartup)) 
            select t).FirstOrDefault(); 

       RegisterModuleServices(mvcBuilder, startUpType); 

       apm.ApplicationParts.Add(new AssemblyPart(assembly));   

       embeddedFileProviders.Add(new EmbeddedFileProvider(assembly)); 

       Modules.Assemblies.Add(assembly);     
      } 

      var compositeFileProvider = new CompositeFileProvider(embeddedFileProviders); 

      mvcBuilder.Services.AddSingleton<IFileProvider>(compositeFileProvider); 

     }); 

     return mvcBuilder; 
    } 

o.FileProviders.Add(compositeFileProvider)のアクションは呼び出されません。

IFileProviderを挿入すると、すべての埋め込みファイルプロバイダが見つかりますが、_fileProvider.GetDirectoryContents( "")を実行するとファイルが見つかりません。

誰もが何故考えているのですか?

答えて

2

なぜ私はそれが何も返されていないことを理解しました... 新しいEmbeddedFileProviderを作成したときにbaseNameSpaceパラメータを設定していないようです。愚かなハァッ。 しかし、これを設定していない例がかなりあり、うまくいきました。 この問題が発生した場合、これが他の人々の役に立つ可能性があります。

+0

あなた自身の回答を受け入れたものとしてマークすることができます。 –

0

プロジェクトのルート名前空間の設定も見てください。私のケースは逆でした。プロジェクトファイルをコピー&ペーストしましたが、以前のプロジェクトの名前空間設定は保持されませんでした。これは、を.csprojの設定 (最上部の<PropertyGroup>ブロックの下にネスト)に明示的に設定していないため、名前空間としてファイル名が使用されたためです。私のコードがbaseNameSpaceパラメータを正しく設定していることを知るにはかなりの時間がかかり、多くの時間が失われていましたが、プロジェクトがファイルを別の名前空間に格納していたのです! (DLLは任意のテキストエディタで開くことができ、一番下までスクロールして、埋め込みテキストを簡単に検証して検証することができます)。それはそこにあった、ちょうど見つからなかった。誰かがこの正しさを持っている場合は、{Assembly}.GetManifestResourceNames()を使ってすべてのファイルをダンプし、あなたの名前が正しいことを確認することもできます。

関連する問題