2017-03-26 14 views
0

ASP.NET CoreプロジェクトでRazorViewEngineOptions用のカスタムIFileProviderを使用しています。 IFileProviderのGetFileInfoでリクエストオブジェクトにアクセスすることは可能ですか?ASP.NET CoreのリクエストオブジェクトへのアクセスIFileProvider(Razor)

public class DBViewProvider : IFileProvider 
{ 
    public IFileInfo GetFileInfo(string subpath) 
    { 
     // access to Request here? 
    } 
} 

Startup.csは:DBViewProviderの唯一の1グローバルインスタンスがあります

public void ConfigureServices(IServiceCollection services) 
{ 

    services.Configure<RazorViewEngineOptions>(options => 
     {    
      options.FileProviders.Add(new DBViewProvider());  
     }); 
} 

ので、私は、リクエストごとにIHttpContextAccessorを注入することができませんでしだ。

答えて

0

IHttpContextAccessorはスレッドローカルを使用します。リクエストごとに1つずつ注入する必要はありません。

+0

あなたは手の込んだおよび/または例を提供してもらえますか? –

0

これは私が今やってしまったことです。

静的IServiceProviderを保持するヘルパークラスを作成しました。 Startup.csで

public static class MyServiceLocator 
{ 
    public static IServiceProvider ServiceProvider; 

    public static void Init(IServiceProvider provider) 
    {  
     ServiceProvider = provider; 
    } 
} 

私はのServiceProviderを初期化します。

私IFileProviderで
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider) 
{  
    MyServiceLocator.Init(serviceProvider); 
} 

私はIHttpContextAccessorを得る:

using Microsoft.Extensions.DependencyInjection; 

... 

public IFileInfo GetFileInfo(string subpath) 
{ 
    IHttpContextAccessor httpContextAccessor = MyServiceLocator.ServiceProvider.GetService<IHttpContextAccessor>();   
} 
+0

IHttpContextAccessorをStartup.Configureに直接挿入して渡すことができるはずです。要求ごとにコンテナから新しいものを解決する必要はありません。 – Tratcher

関連する問題