すべてのコントローラーを登録するために次のコードを使用しています。
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();
その後、同じエラーが再び発生しました。
では、このような状況でコントローラーを登録する正しい方法は何ですか? ありがとう。