使用autofac SingleInstance

时间:2018-10-26 09:39:10

标签: c# wcf autofac

我在Google上搜索了很多东西,似乎没有一个答案可以回答我的问题,希望它不会重复。

我正在开发一项服务,我不想完全重建并保持原样,而只是将交易的一部分落实到其中。

有一个服务具有由autofac创建的wcf网关的实例,它是一个SingleInstance(),例如:

public static void RegisterMyService(ContainerBuilder builder)
    {
        builder.Register(c => new DesiredGatewayInterceptor());
        builder
            .Register(
                c =>
                {
                    const string BindingName = "BasicHttpBinding_My_PortType";
                    Uri endpointAddress = null;
                    ClientSection servicesSection = (ClientSection)WebConfigurationManager.GetSection("system.serviceModel/client");
                    foreach (ChannelEndpointElement endpoint in servicesSection.Endpoints)
                    {
                        if (endpoint.Name == BindingName)
                        {
                            endpointAddress = endpoint.Address;
                            break;
                        }
                    }

                    ChannelFactory<DesiredGateway> channel = new ChannelFactory<DesiredGateway>(
                        new BasicHttpBinding(BindingName),
                        new EndpointAddress(endpointAddress));

                    NameValueCollection section = (NameValueCollection)ConfigurationManager.GetSection("CredentialsConfiguration");

                    channel.Credentials.UserName.UserName = section["DesiredGatewayUser"];
                    channel.Credentials.UserName.Password = section["DesiredGatewayPassword"];
                    return channel;
                })
            .SingleInstance();

        builder
            .Register(c => c.Resolve<ChannelFactory<DesiredGateway>>().CreateChannel())
            .InterceptTransparentProxy(typeof(DesiredGateway))
            .InterceptedBy(typeof(DesiredGatewayInterceptor))
            .UseWcfSafeRelease();
    }

我已经了解了用于操作标头的OperationContextScope(),但是由于此网关实例是由autofac注册的,因此我无法正确地转换为IContextChannel。

using (OperationContextScope scope = new OperationContextScope((IContextChannel)desiredGateway))
{
   // Do some stuff with headers now
}

这样的转换给了我一个例外,因为desireGateway的实例被包装在某种容器中,该容器不是IContextChannel,但是一旦我使用channel.CreateChannel()创建了自己的desireGateway的实例,我就可以将其转换为IContextChannel。

目标是能够在每次调用desirableGateway时注入一个头值,是否有任何方法可以实现此目的而又无需过多重建现有实现?也许存在一种更清洁的方法来实现上述目标?

1 个答案:

答案 0 :(得分:0)

所以我最终从网关注册中删除了这些行:

.InterceptTransparentProxy(typeof(DesiredGateway))
.InterceptedBy(typeof(DesiredGatewayInterceptor))

这允许我然后将其强制转换为IContextChannel,并使用通用方法在拥有网关实例的类中实现了跨段处理。