web-dev-qa-db-ja.com

Autofac-コントローラーにパラメーターのないパブリックコンストラクターがあることを確認します

私はそれが以前に尋ねられて答えられたことを知っています-私が尋ねている理由は、私がこの問題に対する提案された解決策をすべて試したが、それでも解決できないためです。

ASP.NET Web API 2.0プロジェクトがあります。 Autofac、_Autofac.Mvc5_、および_Autofac.WebApi2_の依存関係がインストールされています。 APIコントローラーを呼び出そうとすると、次のエラーが表示されます。

タイプ「MyController」のコントローラーを作成しようとしたときにエラーが発生しました。コントローラーにパラメーターなしのパブリックコンストラクターがあることを確認してください。

_Global.asax_には、_App_Start_内に配置したIocConfig.Config()の呼び出しがあります。

_public static class IocConfig
{
    public static void Config()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<MyLogger>().As<IMyLogger>();

        builder.RegisterApiControllers(Assembly.GetCallingAssembly());
        builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

        WebApiApplication.Container = builder.Build();

        DependencyResolver.SetResolver(
            new AutofacDependencyResolver(WebApiApplication.Container));
        GlobalConfiguration.Configuration.DependencyResolver =
             new AutofacWebApiDependencyResolver(WebApiApplication.Container);
    }
}
_

そして、これはMyControllerのコンストラクタです:

_public MyController(IMyLogger logger)
_

呼び出そうとすると、コンストラクターについて指定されたエラーが発生します。私は何が欠けていますか?

14
developer82

このエラーも発生しましたが、根本的な原因は、コントローラーの依存関係の1つがAutofacに正しく登録されていなかったことです。

InnerExceptionには詳細があり(私の場合はAutofac.Core.DependencyResolutionExceptionでした)、ExceptionMessageにはこの依存関係の詳細が含まれていました。以下に沿って:

「特定の登録のアクティベーション中にエラーが発生しました...パラメータ「XXXX」を解決できません

18
ScottB

この回答 を確認してください。
WebApiコントローラーの正しいContainerBuilder()を構成するのに役立ちます。

このようなエラーの解決策を探している場合、まずDependencyResolverの設定を確認する必要があります。

私は同じ問題に直面しましたが、問題はAPIではなくMVCコントローラーのContainerBuilder()オブジェクトにAutofacコードサンプルを使用していたことです。

両方のタイプのコントローラー(MVCおよびApi)を登録するための私のコード:

var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register MVC Controllers
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers
builder.RegisterType<Type>().As<IType>();

var container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //Set the WebApi DependencyResolver
10
neustart47

Assembly.GetCallingAssembly()は、型が定義されているアセンブリではなく、呼び出し元のアセンブリを返します。

_Assembly.GetCallingAssembly_ Method
現在実行中のメソッドを呼び出したメソッドのアセンブリを返します。

動作させるには、typeof(IocConfig).Assemblyまたは_Assembly.GetExecutingAssembly_を使用する必要があります

3
Cyril Durand

アプリの開始コードでautofacを登録していないと思います。

これを使って:

protected void Application_Start()
{
    IocConfig.Config();
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
   BundleConfig.RegisterBundles(BundleTable.Bundles);
}

詳細については、このブログを参照してください http://www.codeproject.com/Articles/808894/IoC-in-ASP-NET-MVC-using-Autofac

0
error_handler