如何使用Autofac从控制台应用程序中使用WCF服务?

问题描述 投票:0回答:1

所以我有一个控制台应用程序,我在其中使用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%确定如何实际提出问题。

谢谢

c# wcf autofac
1个回答
1
投票

始终创建新代理并在每次调用后关闭它的方法对WCF有用。

否则你可能遇到问题。例如,如果一个服务调用失败,代理创建的通道将进入故障状态,您无法对其进行更多调用而只是中止它。然后,您需要创建一个新的代理。如果同时从多个线程调用同一代理,也可能会出现线程问题。

另请查看此documentation,其中包含如何在调用WCF服务时正确处理错误的示例。

有一个Autofac.Wcf包可以帮助您创建和释放频道。检查documentation here。它使用动态客户端生成方法,您只需提供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();
© www.soinside.com 2019 - 2024. All rights reserved.