2011-05-31 37 views
0

我希望能夠使用發送給構造函數的默認參數來解析類,但是我希望能夠在指定參數時覆蓋此類。具有默認參數的Autofac類 - >覆蓋att運行時

這是我如何註冊:

builder.RegisterType<SearchService<WebPage>>().As<ISearchService<WebPage>>().WithParameter(
      new NamedParameter("solrUrl", ConfigurationManager.AppSettings["UrlWeb"])).SingleInstance(); 
     builder.RegisterType<SearchService<Document>>().As<ISearchService<Document>>().WithParameter(
      new NamedParameter("Url", ConfigurationManager.AppSettings["solrUrlDocs"])).SingleInstance(); 

要解決我想能夠這樣:

_containerProvider.RequestLifetime.Resolve<ISearchService<WebPage>(); 

其做工精良,但我也希望能夠做到這一點:

_containerProvider.RequestLifetime.Resolve<ISearchService<WebPage>(new NamedParameter("Url", "some other url")); 

這不起作用..所以我的問題是,如果有可能使用默認參數註冊我希望能夠在運行時重寫?

+0

在你登記'SearchService '的參數被命名爲'solrUrl'。我想當你解決你應該使用相同的名字'solrUrl'。但是,您正在使用「Url」,它是「SearchService 」註冊的參數名稱。 Autofac使用反射來確定參數名稱,所以它們必須按照它們在類構造函數中的名稱進行命名http://code.google.com/p/autofac/wiki/ResolveParameters – bentayloruk 2011-05-31 14:27:30

回答

6

下面是一個完整而簡單的示例,展示瞭如何在運行時覆蓋在註冊時配置的NamedParameter

重要提示:用於NamedParameter的參數名稱必須與您註冊然後解析的類的構造函數中的參數名稱相匹配。在下面的例子中,Thing的構造函數的參數是name

using System; 
using Autofac; 

namespace BillAndBenConsole 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var builder = new ContainerBuilder(); 
      builder.RegisterType<Thing>().WithParameter("name", "bill"); 
      var container = builder.Build(); 

      Console.WriteLine(container.Resolve<Thing>().Name);//Writes bill 
      Console.WriteLine(container.Resolve<Thing>().Name);//Writes bill 
      Console.WriteLine(container.Resolve<Thing>(new NamedParameter("name", "ben")).Name);//Writes ben 
      Console.ReadLine(); 
     } 
    } 

    public class Thing 
    { 
     public string Name { get; set; } 

     public Thing(string name) 
     { 
      Name = name; 
     } 
    } 
} 
+0

問題是我使用鏈接來解析NamedParameter,但它解決它爲IEnumerable 和鉤子作爲對象參數,而不是IEnumerable ..我試圖轉換,但我得到了一個異常,指定強制轉換無效...(從DictionaryEntry參數在參數中選擇新的NamedParameter(argument.Key。 ToString(),argument.Value))。Cast ().ToList(); – NetProvoke 2011-06-01 08:52:42