【发布时间】:2013-04-10 07:47:06
【问题描述】:
我们创建了几个处理异步请求的 WCF 服务。我们使用basicHttpBinding,因此我们的InstanceContextMode 是PerCall,这就是造成一些混乱的原因。我们看到使用 Microsoft 的 Unity 容器注入的应用程序的这些部分出现异常行为。
我们正在解析下面的引用以创建一个在整个应用程序中使用的 Foo 单例。然而,当服务被快速连续命中时,Foo 偶尔会抛出异常,表明它正被多个线程访问,并因此以意想不到的方式改变了它的状态。
Container.RegisterType<IFoo, Foo>(new ContainerControlledLifetimeManager());
现在,如果我们将生命周期管理器更改为 TransientLifetimeManager - 本质上是告诉容器在每次解决该类时注入一个新实例,问题就会得到纠正。
Container.RegisterType<IFoo, Foo>(new TransientLifetimeManager());
据我了解,WCF 不控制 AppDomain 的生命周期,主机控制。在我们的例子中,就是 IIS。那么,鉴于这些信息,我们的PerCall WCF 请求是否可能正常工作,但由于 AppDomain 的管理方式,我们是否可以访问同一个注入对象,因为它的单例实现?
感谢您的宝贵时间!
【问题讨论】:
-
Unity 是在 IInstanceProvider 行为中创建的,还是以不同的方式注入依赖项?
标签: c# wcf ioc-container appdomain application-lifecycle