Repository classes aren't getting disposed in ServiceStack
我正在使用MVC+EF+ServiceStack。我最近发现了一些关于EF上下文和过时数据的问题。我有一些存储库类,我将它们注入带有requestScope.none的控制器中。存储库类在使用后不会被IOC处理。
ServiceStack的IOC文档声明,如果实现IDisposable,则容器在使用后应调用Dispose方法。我想知道这种行为是否不同,因为我不从服务堆栈服务中调用对象?
在此处注册回购:
1 | container.RegisterAutoWiredAs<LicenseRepository, ILicenseRepository>().ReusedWithin(ReuseScope.None); |
控制器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [Authorize] public class LicenseController : BaseController { public ILicenseRepository licenseRepo { get; set; } //injected by IOC private ILog Logger; public LicenseController() { Logger = LogManager.GetLogger(GetType()); } public ActionResult Edit(Guid id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var license = licenseRepo.GetLicense(id); if (license == null) { return HttpNotFound(); } return View(license); } ... } |
典型的知识库类:(dbContext正在基类中实例化)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class LicenseRepository: RepositoryBase<LicensingDBContext>, ILicenseRepository,IDisposable { public License GetLicense(Guid id) { return DataContext.Licenses.Find(id); } .... public void Dispose() { base.Dispose(); } } |
ServiceStack只对ServiceStack请求中解析的依赖项调用
在ServiceStack请求的上下文之外,ServiceStack不拥有它的所有权,也就是说,它不知道何时使用或不再需要它。因此,需要显式地释放任何已解析的依赖项。
您没有在using块中使用您的repo,也没有在repo上显式地调用dispose,我认为要得到立即的处理,您需要执行其中一个或另一个操作,如果它与IDisposable的其他实现类似的话。
我不熟悉ServiceStack,但是像其他任何IDisposable对象一样,您可以这样处理它(当它位于using块中时不是一个选项):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public ActionResult Edit(Guid id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var license = licenseRepo.GetLicense(id); licenseRepo.Dispose(); if (license == null) { return HttpNotFound(); } return View(license); } |