2017-05-04 12 views
-1

ASP.Net Core IoCコンテナには、現在どのビューが表示されているかに基づいてインターフェイスの実装を提供します。私は、実行時にファクトリメソッドを提供することでこれを行うことができるはずだと考えました。 Startup.csで私は、次の登録を追加しました:ASP.NetのコアDIファクトリ(HttpContextに基づく)

services.AddTransient<IMyInterface>(serviceProvider => 
{ 
    var context = serviceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext; 

    //Need to switch on current view somehow? 
    switch(context.??????){ 
     case ???: 
      return new MyImplementationOne(); 
     case ???: 
      return new MyImplementationTwo(): 

    } 

} 

はどのようにして示されている現在のビューに基づいて切り替えることHttpContextを使用することができますか?または、serviceProviderで利用可能な他のサービスを使用していますか?

+0

は、あなたがリクエストURLを使用してみましたか?コントローラのアクションが実行され、ビューの結果が返される前に、どのビューが表示されるかわからない。そしてその時点で、すべての依存関係はすでに解決されていなければなりません。 – juunas

+0

@juunas私はこれに初めてです:どのようにリクエストURLを取得しますか? 'context.Request'は' URL'プロパティを持っていませんか? –

+0

'Path'プロパティがあります。 – juunas

答えて

-1

通常あなたが例IWhateverServiceFactoryのために...

これは、ビュー名を取り込み方法、(あなたがRouteContextから入手可能)とリターンを持っているでしょう、あなたのDIコンテナの「ファクトリー」を登録します関連する実装。このようにすれば、将来どのような時点で汎用的な実装を使用したい場合など、どの実装が容易になるかをロジックに変更できます。

public interface IWhateverServiceFactory{ 
    IService GetService(String currentViewName); 
} 

public class DefaultWhateverServiceFactory : IWhateverServiceFactory{ 
    IService GetService(String currentViewName){ 
     switch(currentViewName){ 
     case ???: 
      return new MyImplementationOne(); 
     case ???: 
      return new MyImplementationTwo(): 
     } 
    } 
} 

RouteContextはあなたのためには機能しません。

System.IO.Path.GetFileNameWithoutExtension(
      ((RazorView)html.ViewContext.View).ViewPath 
     ); 

あなたはアクション名を取得するために、ビュー名、または

Html.ViewContext.RouteData.GetRequiredString("action"); 

を取得するためにかみそりを使用している場合...

関連する問題