web-dev-qa-db-ja.com

ASP.NET Core 2.0注入コントローラーとAutofac

コントローラーに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なしで「モジュール」を使用する方法がある場合、私はどんな提案でも非常に興味深いでしょう:)

よろしくお願いします!

4
Nieksa

ASP.NET CoreでInstancePerLifetimeScopeを使用します。 このようなASP.NETとASP.NET Coreの違いは文書化されています

4
Travis Illig

デフォルトでは、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);
  }
}
4