所以我有一个使用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%知道如何实际表达问题。
谢谢
答案 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();