.net 使用AutoFac创建未定义长度的对象集合

.net 使用AutoFac创建未定义长度的对象集合,.net,dependency-injection,autofac,.net,Dependency Injection,Autofac,我从第三方供应商那里得到一些报价。我正在将引号传输到本地对象,但需要有关如何为列表创建新引号对象的建议,如果您不知道构造函数中需要多少引号 我试过这个 public class ConvertThirdPartyQuoteToLocalQuote { private readonly IQuote quote; public ConvertThirdPartyQuoteToLocalQuote(IQuote quote) {

我从第三方供应商那里得到一些报价。我正在将引号传输到本地对象,但需要有关如何为列表创建新引号对象的建议,如果您不知道构造函数中需要多少引号

我试过这个

 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类ConvertThirdPartyQuoteToLocalQuote
{
私人只读iNote报价;
公共兑换第三方报价至本地报价(iNote报价)
{
this.quote=quote;
}
公共iNote转换域报价(列出第三方报价)
{
var response=newlist();
foreach(第三方报价中的第三方报价)
{
quote.Price=第三方quote.Price;
quote.Description=第三方quote.Price;
回复。添加(报价);
}
返回响应;
}
}
但它只是重写了同一个对象

我想做这样的事情,但不知道怎么做

    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; 
        }
    }
public类ConvertThirdPartyQuoteToLocalQuote
{
公共iNote转换域报价(列出第三方报价)
{
var response=newlist();
foreach(第三方报价中的第三方报价)
{
//使用autofac在每个循环中新建一个实例
//或者通过构造函数传递它
quote.Price=第三方quote.Price;
quote.Description=第三方quote.Price;
回复。添加(报价);
}
返回响应;
}
}
如果可以避免的话,我真的不想用autofac代码污染我的代码,所以最好通过构造函数传递对象,但我愿意妥协


有什么想法吗?

您可以通过使用委托注入来避免对容器的依赖

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;
        }
    }
}
public类ConvertThirdPartyQuoteToLocalQuote
{
私有只读Func quoteBuilder;
公共转换第三方报价至本地报价(
Func quoteBuilder)
{
this.quoteBuilder=quoteBuilder;
}
公共IEnumerable converttoomainquote(
IEnumerable第三方报价)
{
foreach(第三方报价中的第三方报价)
{
iNote quote=this.quoteBuilder();
quote.Price=第三方quote.Price;
quote.Description=第三方quote.Price;
收益回报报价;
}
}
}
配置如下所示:

var mainBuilder = new ContainerBuilder();
mainBuilder.RegisterType<IQuote>().As<Quote>();
mainBuilder.Register((c, p) => 
    new ConvertThirdPartyQuoteToLocalQuote(() => c.Resolve<IQuote>()));
IContainer container = mainBuilder.Build();
var mainBuilder=newcontainerbuilder();
mainBuilder.RegisterType().As();
主生成器注册表((c,p)=>
新的ConvertThirdPartyQuoteLocalQuote(()=>c.Resolve());
IContainer容器=mainBuilder.Build();

如果我想将参数传递到quoteBuilder()中,以便添加到构造函数中,该怎么办?例如var someValue=“someValue”;iNote quote=this.quoteBuilder(someValue)@user1838438如果您想要将某个内容传递到构造函数中,那么
容器不应该是等式的一部分。您应该只
new
创建一个
Quote
对象-尝试将
容器的使用限制为服务注入,而不是创建
Dto
类型的实例。