Класс Autofac с параметром по умолчанию -> Override att runtime - PullRequest
0 голосов
/ 31 мая 2011

Я хочу иметь возможность разрешить класс с параметрами по умолчанию, отправляемыми в конструктор, но я хочу иметь возможность переопределить это при указании параметра.

Вот как я регистрируюсь:

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 Ответ

6 голосов
/ 31 мая 2011

Ниже приведен полный и простой пример, показывающий, как переопределить во время выполнения, 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;
        }
    }
}
...