存储库类不会在ServiceStack中处理

时间:2015-04-23 16:14:20

标签: c# asp.net-mvc servicestack

我正在使用MVC + EF + ServiceStack。我最近发现了EF上下文和陈旧数据的一些问题。我有使用RequestScope.None在控制器中注入的存储库类。使用后,存储库类不会被IoC处理掉。

ServiceStack的IoC文档指出,如果它实现了IDisposeable,容器应该在使用后调用dispose方法。我想知道这种行为是否不同,因为我没有从服务堆栈服务中调用对象?

在此处注册回购:

import sys
from PyQt4 import QtCore, QtGui

class Ui_Form(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(591, 591)
        self.Background = QtGui.QLabel(Form)
        self.Background.setGeometry(QtCore.QRect(0, 0, 631, 591))
        self.Background.setPixmap(QtGui.QPixmap("Python/LP_Proj/LP_Background.png"))
        self.Background.setObjectName("Background")

        self.btn_a1 = Button(Form)

        self.btn_a2 = QtGui.QPushButton(Form)
        self.btn_a2.setGeometry(QtCore.QRect(90, 40, 41, 41))
        self.btn_a2.setObjectName("btn_a2")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Launchpad Control", None, QtGui.QApplication.UnicodeUTF8))

class Button(QtGui.QPushButton):
    def __init__(self, Form):
        super(Button, self).__init__()
        self.setAcceptDrops(True)

        self.setGeometry(QtCore.QRect(30, 40, 41, 41))
        self.setObjectName("btn_a1")

if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Ui_Form()
    ex.show()
    sys.exit(app.exec_())

控制器:

 container.RegisterAutoWiredAs<LicenseRepository, ILicenseRepository>().ReusedWithin(ReuseScope.None);

典型的存储库类:( dbcontext在基类中实例化)

[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);
    }
    ...
}

2 个答案:

答案 0 :(得分:2)

ServiceStack仅在ServiceStack请求中解析的依赖关系上调用Dispose(),即它跟踪从Funq解析的任何一次性用户,并在ServiceStack请求结束时处理它们。

在ServiceStack请求的上下文之外,ServiceStack没有它的所有权,即它无法知道何时使用或不再需要它。因此,需要明确处理任何已解析的依赖项。

答案 1 :(得分:1)

你没有在使用区块中使用你的repo或者在repo上显式调用dispose,我认为如果它与IDisposable的其他实现类似,你可以立即处理,你需要做一个或另一个。

我不熟悉ServiceStack,但是像任何其他IDisposable对象一样可以处理它(当在一个使用块中使用它时):

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);
}