は方法です:
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());
}
}
ありがとう、これは動作します。 (...しかし、うわー、非常に単純なもののためにジャンプするために多くのフープが) – grokky
また、私はgithubプロジェクトページで 'ActionContextAccessor'がデフォルトで登録されていないことを思い出しています。簡単な方法。しかし、それは私のニーズに十分適しています。 – grokky
地域情報を取得するために必要です。私は、エリア名を取得する別の方法があるかどうかはわかりません。リクエストパス(エリアの一部)が使われるかもしれませんが、この場合は 'HttpContextAccessor'を注入する必要があり、それは良い方法ではないと思います。 –