コントローラーにAutofacを注入しようとしています。残念ながら、「DefaultControllerActivator」がコントローラーを構築しないようにAutofacを離れた場所に構成することはできませんか?
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddControllersAsServices();
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterModule<ServiceModule>();
containerBuilder.Populate(services);
containerBuilder.RegisterType<LoginController>().PropertiesAutowired();
ApplicationContainer = containerBuilder.Build();
return new AutofacServiceProvider(this.ApplicationContainer);
}
public class ServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterModule(new DataProviderModule());
builder.RegisterType(typeof(LoginService)).As(typeof(ILoginService)).InstancePerRequest();
}
}
[Route("api/[controller]")]
public class LoginController : Controller
{
private readonly ILoginService _loginService;
public LoginController(ILoginService loginService)
{
_loginService = loginService;
}
}
上記のように私はAutofacのドキュメントに従いました。残念ながら、LoginControllerはインジェクションを必要とするため構築されません。
編集:Autofacなしで「モジュール」を使用する方法がある場合、私はどんな提案でも非常に興味深いでしょう:)
よろしくお願いします!
ASP.NET CoreでInstancePerLifetimeScope
を使用します。 このようなASP.NETとASP.NET Coreの違いは文書化されています 。
デフォルトでは、ASP.NET Coreはコンテナーからのコントローラーパラメーターを解決しますが、実際にはコンテナーからのコントローラーを解決しません。通常、これは問題ではありませんが、次のことを意味します。
コントローラーのライフサイクルはフレームワークによって処理されます、リクエストのライフタイムではありません。
コントローラーコンストラクターパラメーターのライフサイクルは、要求の有効期間によって処理されます。コントローラーの登録中に行った可能性のある特別な配線(プロパティインジェクションのセットアップなど)は機能しません。
MVCをサービスコレクションに登録するときにAddControllersAsServices()を指定してこれを変更。これを行うと、builder.Populate(services)を呼び出したときに、コントローラータイプがIServiceCollectionに自動的に登録されます。
public class Startup
{
public IContainer ApplicationContainer {get; private set;}
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add controllers as services so they'll be resolved.
services.AddMvc().AddControllersAsServices();
var builder = new ContainerBuilder();
// When you do service population, it will include your controller
// types automatically.
builder.Populate(services);
// If you want to set up a controller for, say, property injection
// you can override the controller registration after populating services.
builder.RegisterType<MyController>().PropertiesAutowired();
this.ApplicationContainer = builder.Build();
return new AutofacServiceProvider(this.ApplicationContainer);
}
}