MVC 4和autofac:DependencyResolutionException

时间:2013-06-26 15:21:10

标签: asp.net-mvc asp.net-mvc-4 autofac

我正在使用以下代码注册我的所有控制器:

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'的构造函数: 无法解析构造函数'Void .ctor(RestSharp.IRestClient,RestSharp.IRestClient)'的参数'RestSharp.IRestClient r1'。 那是我所期待的,所以那么 我尝试添加以下代码:

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

然后我再次遇到同样的错误。

那么在这种情况下注册控制器的正确方法是什么? 感谢。

1 个答案:

答案 0 :(得分:1)

您需要在没有 .As<IController>()的情况下注册您的控制器(或者您需要使用.AsSelf(),但这是默认设置)。

您需要这样做,因为框架将尝试使用具体类型HomeController而不是IController接口来解析Controller(因此RegisterControllers方法将所有控制器注册为{内部{1}}。

因此,以下注册应该有效

.AsSelf()

注意:您应该在<{strong> builder.Register( c => new HomeController( c.ResolveNamed<IRestClient>("Url1"), c.ResolveNamed<IRestClient>("Url2"))) .InstancePerLifetimeScope(); 电话后进行此次呼叫。