我正在使用ASP.NET MVC开发一个现有的C#Web应用程序,目标是.NET 4.5。它使用Unity for IoC,自定义生命周期管理器看起来等同于每个请求(我相信它是在PerRequestLifetimeManager添加到Unity之前设置的)。该项目还使用实体框架与SQL Server数据库进行通信,并使用WCF客户端与Web服务进行通信。
注册的类型是:映射到其类的几个自定义服务接口(这些接口当前都没有实现IDisposable),映射到WCF客户端的派生类的接口,以及DBContext的派生类。
我对IoC很新;我已经做了一些阅读准备添加日志记录任务,我认为代码库中存在问题。我稍后会发布有关我计划更改的后续问题,但我想先确保现有代码是正确的。
服务类将其WCF和DBContext派生类作为属性注入:
[Dependency]
public IMyWCFClient MyWCFClient { get; set; }
[Dependency]
public MyDBContextDerivedClass MyDBContext { get; set; }
我相信这对于DBContext属性是可以的,因为它实际上不需要Dispose
'd,但是对于WCF客户端我认为它永远不会被正确清理 - Close()
是从不手动调用,永远不会手动调用Dispose()
,并且服务不会实现IDisposable
。此外,从我的阅读中可以看出,在服务上实现IDisposable
并在其WCF客户端属性上调用Dispose()
是错误的,而我们需要调用Close()
,检查许多异常,如有必要,请致电Abort()
。
我认为目前的实施是一个问题我是否正确?
如果是这样,我找到了ChannelAdam WCF库(https://www.nuget.org/packages/ChannelAdam.Wcf),它看起来像是一个很有前景且希望不太痛苦的方法来解决这个问题 - 这是一种合理的方法吗?
编辑:另外,我是对的,我不需要担心清理DBContext吗?