我的服务中有以下代码。当我向GET /posts
无法完成操作,因为已放弃DbContext
我应该如何处理DbContext?我可以在这里使用Service的Dispose方法,或者在什么情况下可以使用它?
public class PostsService : ServiceStack.Service
{
BlogDbContext db = new BlogDbContext();
public object Get(GetAllPosts req)
{
return db.Posts;
}
public override void Dispose()
{
if (db != null)
{
db.Dispose();
}
base.Dispose();
}
}
答案 0 :(得分:1)
不幸的是我无法重现你的问题,我的处理模式之后的简单测试成功了。
我创建了一个虚拟BlogDbContext
:
public class BlogDbContext : IDisposable
{
public void DummyMethod()
{
}
public void Dispose()
{
Console.WriteLine("Disposing BlogDbContext");
}
}
然后我实施了一项测试服务,例如PostsService
:
[Route("/Test", "GET")]
public class TestRequest : IReturnVoid {}
public class TestController : Service
{
BlogDbContext db = new BlogDbContext();
public void Get(TestRequest request)
{
Console.WriteLine("Request use BlogDbContext");
db.DummyMethod();
Console.WriteLine("Finished using BlogDbContext");
}
public override void Dispose()
{
if(db != null)
db.Dispose();
base.Dispose();
}
}
当我调用/Test
路由时,不会抛出异常并且控制台输出:
这会向我表明,BlogDbContext
中存在一个问题,即您没有留下足够长的时间来使用。如果你不处理服务,你的BlogDbContext
是否还活着?
如果我正在实施该服务,我将利用ServiceStack的依赖注入(See here for more information),并使用您的AppHost配置方法将数据库实例注入您的服务。请求结束后,系统会自动调用BlogDbContext
的{{1}}方法。因此,您无需在服务中实施Dispose
。 比听起来容易。
在AppHost中,添加到您的Configure方法:
override void Dispose
在您的服务替换中
public override void Configure(Funq.Container container)
{
// This injects your Database Context, a fresh context for each request
container.Register<BlogDbContext>(c => new BlogDbContext()).ReusedWithin(Funq.ReuseScope.None);
}
与
BlogDbContext db = new BlogDbContext();
它还使您的代码更容易进行测试。
如果您仍然发现它失败了,那么您的public BlogDbContext db { get; set; }
...
// Remember to remove the: public override void Dispose()
肯定会出现问题。