存储库 类 未在 ServiceStack 中处理
Repository classes aren't getting disposed in ServiceStack
我正在使用 MVC + EF + ServiceStack。我最近发现了 EF 上下文和陈旧数据的一些问题。我有存储库 classes,我正在使用 RequestScope.None 将其注入控制器。存储库 classes 在使用后不会被 IoC 处置。
ServiceStack 的 IoC 文档指出,如果它实现了 IDisposeable,则容器应在使用后调用 dispose 方法。我想知道这种行为是否不同,因为我不是从服务堆栈服务中调用对象?
在此处注册存储库:
container.RegisterAutoWiredAs<LicenseRepository, ILicenseRepository>().ReusedWithin(ReuseScope.None);
控制器:
[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);
}
...
}
典型存储库 class:(dbcontext 在基础 class 中实例化)
public class LicenseRepository: RepositoryBase<LicensingDBContext>, ILicenseRepository,IDisposable
{
public License GetLicense(Guid id)
{
return DataContext.Licenses.Find(id);
}
....
public void Dispose()
{
base.Dispose();
}
}
您没有在 using 块中使用您的存储库,也没有在存储库上显式调用 dispose,我认为要立即进行处理,您需要做一个或另一个,如果它与 IDisposable 的其他实现一样。
我不熟悉 ServiceStack,但是像任何其他 IDisposable 对象一样,您可以这样处理它(当不能将它放在 using 块中时):
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);
}
ServiceStack 仅在 ServiceStack 请求中解析的依赖项上调用 Dispose()
,即它跟踪从 Funq 解析的任何一次性项并在 ServiceStack 请求结束时处理它们。
在 ServiceStack 请求的上下文之外,ServiceStack 没有它的所有权,即它不知道它何时被使用或不再需要。因此,任何已解决的依赖项都需要明确处理。
我正在使用 MVC + EF + ServiceStack。我最近发现了 EF 上下文和陈旧数据的一些问题。我有存储库 classes,我正在使用 RequestScope.None 将其注入控制器。存储库 classes 在使用后不会被 IoC 处置。
ServiceStack 的 IoC 文档指出,如果它实现了 IDisposeable,则容器应在使用后调用 dispose 方法。我想知道这种行为是否不同,因为我不是从服务堆栈服务中调用对象?
在此处注册存储库:
container.RegisterAutoWiredAs<LicenseRepository, ILicenseRepository>().ReusedWithin(ReuseScope.None);
控制器:
[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);
}
...
}
典型存储库 class:(dbcontext 在基础 class 中实例化)
public class LicenseRepository: RepositoryBase<LicensingDBContext>, ILicenseRepository,IDisposable
{
public License GetLicense(Guid id)
{
return DataContext.Licenses.Find(id);
}
....
public void Dispose()
{
base.Dispose();
}
}
您没有在 using 块中使用您的存储库,也没有在存储库上显式调用 dispose,我认为要立即进行处理,您需要做一个或另一个,如果它与 IDisposable 的其他实现一样。
我不熟悉 ServiceStack,但是像任何其他 IDisposable 对象一样,您可以这样处理它(当不能将它放在 using 块中时):
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);
}
ServiceStack 仅在 ServiceStack 请求中解析的依赖项上调用 Dispose()
,即它跟踪从 Funq 解析的任何一次性项并在 ServiceStack 请求结束时处理它们。
在 ServiceStack 请求的上下文之外,ServiceStack 没有它的所有权,即它不知道它何时被使用或不再需要。因此,任何已解决的依赖项都需要明确处理。