存储库 类 未在 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 没有它的所有权,即它不知道它何时被使用或不再需要。因此,任何已解决的依赖项都需要明确处理。