2013-11-20 72 views
0

我從第三方提供商處獲取一些引號。我在轉化中的引號,以我的本地對象,但需要有關如何創建一個新的報價對象,你不知道你有多少的報價需要在構造函數列表建議使用AutoFac創建未定義長度的對象集合

我想這

public class ConvertThirdPartyQuoteToLocalQuote 
    { 
     private readonly IQuote quote; 

     public ConvertThirdPartyQuoteToLocalQuote(IQuote quote) 
     { 
      this.quote = quote; 
     } 

     public IQuote ConvertToDomainQuote(List<ThirdPartyQuote> thirdPartyQuotes) 
     { 
      var response = new List<IQuote>(); 

      foreach (var thirdPartyQuote in thirdPartyQuotes) 
      { 
       quote.Price = thirdPartyQuote.Price; 
       quote.Description = thirdPartyQuote.Price; 
       response.Add(quote); 
      } 

      return response; 
     } 
    } 

但它只是寫了同一個對象。

我想要做一些像這樣的事情,但不知道怎麼回事,

public class ConvertThirdPartyQuoteToLocalQuote 
    { 


     public IQuote ConvertToDomainQuote(List<ThirdPartyQuote> thirdPartyQuotes) 
     { 
      var response = new List<IQuote>(); 

      foreach (var thirdPartyQuote in thirdPartyQuotes) 
      { 

       // Use autofac to new up an instance in each loop 
       // or pass it through the constructor 

       quote.Price = thirdPartyQuote.Price; 
       quote.Description = thirdPartyQuote.Price; 
       response.Add(quote); 
      } 

      return response; 
     } 
    } 

我真的不希望我的污染與autofac代碼代碼,如果我能避免它,以便傳遞對象通過構造函數是可取的,但願意妥協

任何想法?

回答

1

通過使用代理注入,可以避免對容器的依賴。

public class ConvertThirdPartyQuoteToLocalQuote 
{ 
    private readonly Func<IQuote> quoteBuilder; 

    public ConvertThirdPartyQuoteToLocalQuote(
     Func<IQuote> quoteBuilder) 
    { 
     this.quoteBuilder = quoteBuilder; 
    } 

    public IEnumerable<IQuote> ConvertToDomainQuote(
     IEnumerable<ThirdPartyQuote> thirdPartyQuotes) 
    { 
     foreach (var thirdPartyQuote in thirdPartyQuotes) 
     { 
      IQuote quote = this.quoteBuilder(); 
      quote.Price = thirdPartyQuote.Price; 
      quote.Description = thirdPartyQuote.Price; 
      yield return quote; 
     } 
    } 
} 

的配置是這樣的:

var mainBuilder = new ContainerBuilder(); 
mainBuilder.RegisterType<IQuote>().As<Quote>(); 
mainBuilder.Register((c, p) => 
    new ConvertThirdPartyQuoteToLocalQuote(() => c.Resolve<IQuote>())); 
IContainer container = mainBuilder.Build(); 
+0

我能做什麼,如果我想一個參數傳遞到quoteBuilder(),這樣我可以添加到構造?例如 var someValue =「SomeValue」; IQuote quote = this.quoteBuilder(someValue); – user1838438

+0

@ user1838438如果你想將某些東西傳遞給構造函數,那麼'Container'不應該成爲方程的一部分。你應該'''''報價'對象 - 試着限制你使用'Container'來服務注入,而不是創建'Dto'類型的實例。 – qujck