1

すべてのコントローラーを登録するために次のコードを使用しています。

protected override void Load(ContainerBuilder builder)
{
  builder.RegisterControllers(typeof(MvcApplication).Assembly)
           .OnActivated(a => a.Context.InjectUnsetProperties(a.Instance))
           .OnActivating(InjectInvoker);
}
private static void InjectInvoker(IActivatingEventArgs<object> obj)
{
    var invoker = obj.Context.ResolveOptional<IActionInvoker>();
    if (invoker != null)
    {
        ((Controller)obj.Instance).ActionInvoker = invoker;
    }
}

しかし今、私は同じ種類の2つのインターフェースを取るコントローラーを持っています:

        builder.Register(c => new RestClient(Url1))
            .Named<IRestClient>("Url1")
           .InstancePerLifetimeScope();

        builder.Register(c => new RestClient(Url2))
            .Named<IRestClient>("Url2")
           .InstancePerLifetimeScope();

    public HomeController(IRestClient r1, IRestClient r2)

次のエラーが表示されます: タイプ 'Site.Controllers.HomeController' の 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' で見つかったコンストラクターは、利用可能なサービスとパラメーターで呼び出すことができません: パラメーター 'RestSharp.IRestClient r1 を解決できません' コンストラクター 'Void .ctor(RestSharp.IRestClient, RestSharp.IRestClient)' の これは予想していたので、次のコードを追加してみました。

        builder.Register(
            c =>
            new HomeController(
                               c.ResolveNamed<IRestClient>("Url1"),
                               c.ResolveNamed<IRestClient>("Url2")))
                             .As<IController>()
                             .InstancePerLifetimeScope();

その後、同じエラーが再び発生しました。

では、このような状況でコントローラーを登録する正しい方法は何ですか? ありがとう。

4

1 に答える 1

1

なしで コントローラを登録する必要があります.As<IController>()(または使用する必要があります.AsSelf()が、これはデフォルト設定です)。

これが必要なのは、フレームワークがインターフェースHomeControllerではなく具象型を使用してコントローラーを解決しようとするためです (したがって、メソッドはすべてのコントローラーを内部的に登録します)。IControllerRegisterControllers.AsSelf()

したがって、次の登録は機能するはずです

builder.Register(
    c =>
        new HomeController(
            c.ResolveNamed<IRestClient>("Url1"),
            c.ResolveNamed<IRestClient>("Url2")))
        .InstancePerLifetimeScope();

注: この呼び出しは、呼び出しのRegisterControllersに行う必要があります。

于 2013-06-26T16:46:24.500 に答える