关于c#:存储库类没有在ServiceStack中处理

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请求中解析的依赖项调用Dispose(),即跟踪从funq解析的任何可处置项,并在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);
}