2013-06-26 37 views
1

我用下面的代碼用於註冊所有的控制器:MVC 4和autofac:DependencyResolutionException

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'的構造函數都沒有可用的服務和參數調用: 無法解析param eter'構造函數'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(); 

然後我再次得到了同樣的錯誤。

那麼在這種情況下注冊控制器的正確方法是什麼? 謝謝。

+0

你的自定義控制器註冊應該在** RegisterControllers調用後執行,並且不需要'.As ()'部分 – nemesv

+0

Url1和Url2從哪裏來,這些變量是什麼? – ryudice

+0

該代碼是一個例子...變量從配置文件中設置,所以它會是Properties.Settings.Default.Url1 – sanjosep43

回答

1

您需要註冊您的控制器沒有.As<IController>()(或者您需要使用.AsSelf(),但這是默認設置)。

你需要這個,因爲該框架將嘗試使用的具體類型HomeController而不是IController接口(所以RegisterControllers方法註冊所有.AsSelf()內部控制器)來解決您的控制器。

所以下面的註冊應該工作

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

注:的RegisterControllers電話後,你應該有這個調用