具有默认参数的Autofac类 - >覆盖att运行时

时间:2011-05-31 14:14:05

标签: autofac

我希望能够使用发送到构造函数的默认参数来解析一个类,但我希望能够在指定参数时覆盖它。

以下是我注册的方式:

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"));

哪个不起作用..所以我的问题是,是否可以注册一个我希望能够在运行时覆盖的默认参数?

1 个答案:

答案 0 :(得分: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;
        }
    }
}