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

时间:2019-02-19 21:00:07

标签: c# wcf autofac

所以我有一个使用Autofac的控制台应用程序。

我已经按照以下步骤设置了控制台应用程序:

我有一个叫做ContainerConfig的类-在这里,我拥有所有的构建器注册:

julia> a[(a.>4) .& (a.<8)]
3-element Array{Int64,1}:
 5
 6
 7

我称自己的主要申请如下:

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();
    }
}

问题是我有连接的WCF服务。这是我的AuditRepository。 (仅供参考-多年来我没有接触过WCF,所以我忘记了我所知道的大部分信息)。

当前每次调用该客户端时都会创建并处理该代理。这个功能-主要是。

看起来像这样:

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

            app.Run(args);

        }
    }

我想知道的是,我可以使用Autofac更好地做到这一点-创建单个实例还是持续打开关闭-还是我完全疯了?我知道我没有完全以正确的方式提出这个问题-并非100%知道如何实际表达问题。

谢谢

1 个答案:

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