Как вы используете службы WCF из консольного приложения, использующего Autofac? - PullRequest
0 голосов
/ 20 февраля 2019

Итак, у меня есть консольное приложение, в котором я использую Autofac.

Я настроил свое консольное приложение следующим образом:

У меня есть класс, который я вызываю ContainerConfig - В этом у меня есть все мои регистрации сборщиков:

public static class ContainerConfig
{
    public static IContainer Configure()
    {
        var builder = new ContainerBuilder();

        builder.Register(c => new MatchRun()).As<MatchRun>).SingleInstance();


        builder.RegisterType<AuditLogic>().As<IAuditLogic>();
        builder.RegisterType<AuditRepository>().As<IAuditRepository>();

        builder.RegisterType<ValidationLogic>().As<IValidationLogic>();

        return builder.Build();
    }
}

Я звонюмое основное приложение выглядит следующим образом:

    private static void Main(string[] args)
    {
        var container = ContainerConfig.Configure();
        using (var scope = container.BeginLifetimeScope())
        {
            var app = scope.Resolve<IApplication>();

            app.Run(args);

        }
    }

Проблема в том, что у меня подключена служба WCF.Это мой AuditRepository.(К вашему сведению - я не касался WCF в течение многих лет, поэтому я забыл большую часть того, что знал).

В настоящее время он создан для создания и утилизации прокси-сервера каждый раз, когда я звоню этому клиенту.Это функции - в основном.

Похоже на это:

    public string GetStuff(string itemA, string itemB)
    {
        try
        {
            GetProxy();
            return _expNsProxy.GetStuff(itemA, itemb);
        }
        catch (Exception ex)
        {
            IMLogger.Error(ex, ex.Message);
            throw ex;
        }
        finally
        {
           // CloseProxyConn();
        }
    }

Что мне интересно, могу ли я сделать это лучше с Autofac - создание одного экземпляра по сравнению с постоянным открытием закрытия - или я просто сумасшедший?Я знаю, что не совсем правильно задаю этот вопрос - не уверен на 100%, как правильно сформулировать вопрос.

Спасибо

1 Ответ

0 голосов
/ 20 февраля 2019

Подход всегда создавать новый прокси и закрывать его после каждого вызова хорош для WCF.

В противном случае вы можете столкнуться с проблемами.Например, в случае сбоя одного вызова службы канал, созданный прокси-сервером, переходит в состояние сбоя, и вы не можете делать больше вызовов на нем, просто прервите его.Затем вам нужно создать новый прокси.Также могут возникнуть проблемы с многопоточностью, если вы вызываете один и тот же прокси-сервер из нескольких потоков одновременно.

Проверьте также эту документацию с примером того, как правильно обрабатывать ошибки при вызове служб WCF.

Существует пакет Autofac.Wcf, который может помочь вам в создании и освобождении каналов.Проверьте документацию здесь .Он использует подход динамической генерации клиентов, когда вы просто даете интерфейс своей службы WCF, и он генерирует канал на основе интерфейса.Это более низкоуровневый подход, поэтому вам нужно больше понимать, что происходит.Сгенерированный класс клиента делает это для вас в фоновом режиме.

Вам нужны две регистрации, одна для фабрики каналов, которая является одноэлементной:

builder
  .Register(c => new ChannelFactory<IYourWcfService>(
    new BasicHttpBinding(), // here you will have to configure the binding correctly
    new EndpointAddress("http://localhost/YourWcfService.svc")))
  .SingleInstance();

И регистрация фабрики, которая будет создавать канал из фабрики каждый раз, когда вы запрашиваете услугу:

builder
  .Register(c => c.Resolve<ChannelFactory<IYourWcfService>>().CreateChannel())
  .As<IIYourWcfService>()
  .UseWcfSafeRelease();
...