每次调用方法GetNext()
时,我都有一个需要返回代码的服务。为此,我有几个代码提供程序实现了一个接口。在ServiceHost打开和关闭之间应该使用相同的代码提供程序,因此对于每个服务调用都应该使用我想避免在每次调用时创建一个代码提供程序实例。
我已经查看了几个帖子,特别是WCF服务的依赖注入(主要是Mark Seemann的答案),其中使用IInstanceProvider和ServiceHostFactory的解决方案允许在服务构建期间传递参数。也许我并没有完全理解那里发生的事情,因为我没有对WCF的深入了解。我最终实现了一个静态工厂,并在服务实现中使用它,如下所示:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single,
InstanceContextMode = InstanceContextMode.PerCall)]
public class CodeService : ICodeService
{
public string GetNext()
{
return CodeProviderFactory.GetCodeProvider().GetNextCode();
}
}
如果需要,我可以通过传递工厂所需的代码类型,从配置数据库或文件中获取它来扩展它,但这不是重点。这是拥有代码提供者的单个实例的最佳方式,如果没有,那么正确(即更优雅,高性能和可维护)的解决方案是什么?让代码提供者的单个实例合法化也是一个问题吗?