2016-11-19 10 views
2

は、だから私のような何かを必要とします

services.AddScoped<IService>(
    c => IsThisTheFooArea 
     ? c.GetRequiredService<FooService>() as IService 
     : c.GetRequiredService<BarService>() as IService 
); 

私はIsThisTheFooAreaチェックを実装する方法がわかりません。

HttpContextまたはそれに類するものにアクセスするにはどうすればよいですか?現在のルートを確認できますか?

答えて

2

は方法です:

ConfigureServices.cs:

 services.AddSingleton<IActionContextAccessor, ActionContextAccessor>(); 
     services.AddScoped<IService>(provider => 
     { 
      var actionContextAccessor = provider.GetService<IActionContextAccessor>(); 
      var descriptor = actionContextAccessor.ActionContext.ActionDescriptor as ControllerActionDescriptor; 
      var areaName = descriptor.ControllerTypeInfo.GetCustomAttribute<AreaAttribute>().RouteValue; 
      if(areaName == "FooArea") 
      { 
       return new FooService(); 
      } 
      else 
      { 
       return new BarService(); 
      } 
     }); 

サービス:

public interface IService { string DoThisThing(); } 

public class FooService : IService 
{ 
    public string DoThisThing() 
    { 
     return "Foo"; 
    } 
} 

public class BarService : IService 
{ 
    public string DoThisThing() 
    { 
     return "Bar"; 
    } 
} 

コントローラ:

[Area("FooArea")] 
public class FooController : Controller 
{ 
    private readonly IService _service; 

    public FooController(IService service) 
    { 
     _service = service; 
    } 

    public IActionResult Index() 
    { 
     return Content(_service.DoThisThing()); 
    } 
} 

[Area("BarArea")] 
public class BarController : Controller 
{ 
    private readonly IService _service; 

    public BarController(IService service) 
    { 
     _service = service; 
    } 

    public IActionResult Index() 
    { 
     return Content(_service.DoThisThing()); 
    } 
} 
+0

ありがとう、これは動作します。 (...しかし、うわー、非常に単純なもののためにジャンプするために多くのフープが) – grokky

+0

また、私はgithubプロジェクトページで 'ActionContextAccessor'がデフォルトで登録されていないことを思い出しています。簡単な方法。しかし、それは私のニーズに十分適しています。 – grokky

+0

地域情報を取得するために必要です。私は、エリア名を取得する別の方法があるかどうかはわかりません。リクエストパス(エリアの一部)が使われるかもしれませんが、この場合は 'HttpContextAccessor'を注入する必要があり、それは良い方法ではないと思います。 –

-1

IControllerFactoryまたはIDependencyResolverを実装(または実装に基づいて実装)し、コントローラの依存関係を注入するためにアプリケーションの起動時に設定する必要があります。ここで

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory(container)); 

// Or... 

DependencyResolver.SetResolver(new MyDependencyResolver(container)); 

詳細情報 https://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency-injection

+1

コア用ではありません。また、私はコントローラに注入する必要はありません。 – grokky

関連する問題