所以我有一个控制台应用程序,我在其中使用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%确定如何实际提出问题。
谢谢
始终创建新代理并在每次调用后关闭它的方法对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();