Autofac WCF 客户端配置

本文关键字:配置 客户端 WCF Autofac | 更新日期: 2023-09-27 17:56:53

我创建了一个 MVC 应用程序,它将调用 WCF 服务上的方法。 我已将客户端应用程序配置为使用 autofac、autofac.integration.mvc 和 autofac.integration.wcf。 我让它使用以下自动fac注册码:

var builder = new ContainerBuilder();
builder
  .Register(c => new ChannelFactory<IUserService>())
  .SingleInstance();
builder
  .Register(c => new ChannelFactory<IUserService>(
    new BasicHttpBinding(),
    new EndpointAddress(@"http://localhost:36763/UserService.svc")))
  .SingleInstance();
builder
  .Register(c => c.Resolve<ChannelFactory<IUserService>>().CreateChannel())
  .As<IUserService>()
  .UseWcfSafeRelease();

但我希望能够避免对端点地址进行硬编码。 有没有办法在不对端点地址进行硬编码的情况下做到这一点?

更新。 我尝试了下面列出的代码,该代码无需对端点地址进行硬编码即可工作。 但它引入了对UserServiceClient的依赖。

        var builder = new ContainerBuilder();
        string endpointAddress;
        using (var userServiceClientProxy = new UserServiceClient())
        {
            endpointAddress = userServiceClientProxy.Endpoint.Address.Uri.OriginalString;
        }
        builder
            .Register(c => new ChannelFactory<IUserService>(
                new BasicHttpBinding(),
                new EndpointAddress(endpointAddress)))
            .SingleInstance();
        builder
            .Register(c => c.Resolve<ChannelFactory<IUserService>>().CreateChannel())
            .As<IUserService>()
            .UseWcfSafeRelease();
        builder.Register(l => LogManager.GetLogger(nameof(WcfClient2))).As<ILog>()
            .SingleInstance();
        builder.RegisterControllers(Assembly.GetAssembly(typeof(HomeController)));
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

Autofac WCF 客户端配置

这就是配置文件(以及作为奖励,配置转换)的目的!大多数 CI 服务器和部署平台甚至具有重写配置值的机制,以保护开发环境免受生产的影响。这只是一个好的做法,没有更好的方法,特别是考虑到除了你之外的其他人最终可能会在你正在构建的这个东西上工作,他们会希望看到一些熟悉的东西!