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而不是IController接口来解析您的控制器(因此该RegisterControllers方法在内部注册了所有控制器.AsSelf())。

所以下面的注册应该有效

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

注意:您应该在通话进行此RegisterControllers通话。

于 2013-06-26T16:46:24.500 回答