Статическое свойство AutofacServiceHost.Container должно быть установлено до того, как могут быть созданы службы - PullRequest
3 голосов
/ 24 марта 2012

В рамках моего проекта служб XXXX.WS WCF я пытаюсь настроить DI / IOC с использованием автозапуска ... Я занимался этим весь день, но я думаю, что я близок (здесь происходят разные ошибки) ... эта ошибка Я не могу понять, как встряхнуть ... "Статическое свойство AutofacServieHost.Container должно быть установлено ..." ... но я думаю, что устанавливаю его!?! Что я делаю не так?

  protected void Application_Start(object sender, EventArgs e)
    {
        var builder = new ContainerBuilder();

        builder.Register(c => new DatabaseFactory()).As<IDatabaseFactory>().Named<DatabaseFactory>("DBFactory");
        builder.Register(c => new ListingSqlRepository(c.ResolveNamed<DatabaseFactory>("DBFactory"))).As<IListingSqlRepository>().Named<ListingSqlRepository>("LSR");
        builder.Register(c => new ListingRepository(c.ResolveNamed<ListingSqlRepository>("LSR"))).As<IListingRepository>().Named<ListingRepository>("LR");
        builder.Register(c => new Service1(c.ResolveNamed<IListingRepository>("LR"))).As<IService1>();

        using (var container = builder.Build())
        {
            Uri address = new Uri("http://localhost:57924/Service1");
            ServiceHost host = new ServiceHost(typeof(Service1), address);

            host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), string.Empty);

            host.AddDependencyInjectionBehavior<IService1>(container);

            //BREAKS HERE?
            host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true, HttpGetUrl = address });
            host.Open();

            Console.WriteLine("The host has been opened.");
            Console.ReadLine();

            host.Close();
            Environment.Exit(0);
        }

    }

Тогда СЕРВИС: пространство имен LOTW2012.WS {

public class Service1 : IService1
{
    private IListingRepository _listingRepository { get; set; }

    public Service1(IListingRepository iLR) {
        this._listingRepository = iLR;
    }

    public Service1()
    {
    }


    public List<Listing> GetListingsByStateName(string stateName)
    {   
        //todo ..getall for now
        var listings = _listingRepository.GetAll().ToList();

        return listings;
    }

1 Ответ

6 голосов
/ 24 марта 2012

Вы должны сообщить интеграции Autofac WCF о контейнере, который вы строите, задав соответствующее свойство:

var builder = new ContainerBuilder();

// ...

AutofacHostFactory.Container = builder.Build();

// ...

Это позволит Autofac разрешать типы служб.

...