我有一个简单的Web API控制器:
public class CarsController : ApiController
{
public SqlConnection Db { get; set; }
public CarsController()
{
Db = new SqlConnection("XXX");
}
public async Task<IEnumerable<Car>> GetAll()
{
//Fetch cars from DB...
}
protected override void Dispose(bool disposing)
{
if (disposing)
Db.Dispose();
base.Dispose(disposing);
}
}
我将处置代码置于Dipose()覆盖中,因为我想写一次。
我可以确定在任何情况下都会调用处理代码吗? (例外情况 例子)。
我可以确定控制器将在后处理 呼吁行动结束,释放资源即将到来 呼叫。
答案 0 :(得分:2)
使用Dispose()
您正在等待GC清理控制器。在Using
方法中使用async Task
语句,该对象将立即释放。是否异常将处理sqlConnection对象。您应该在SqlConnection
而不是构造函数中实例化async Task
,以有效地使用Using
。
答案 1 :(得分:0)
我认为您想使用此处概述的方法:Disposing resources at the end of Web API request。
Web API框架提供了HttpRequestMessage.RegisterForDispose方法,以允许您注册希望在请求结束时处置的所有引用。因此您的代码将如下所示:
class MyApplication(Application):
def __init__(self):
# Initialise with the first layout
super(MyApplication, self).__init__(
layout=VSplit([
Window(content=BufferControl(buffer_name=DEFAULT_BUFFER)),
Window(width=D.exact(1),
content=FillControl('|', token=Token.Line)),
Window(content=BufferControl(buffer_name='RESULT')),
]),
)
def add_buffer(self):
# Update to use a new layout
self.layout = VSplit([
Window(content=BufferControl(buffer_name=DEFAULT_BUFFER)),
Window(width=D.exact(1),
content=FillControl('|', token=Token.Line)),
Window(content=BufferControl(buffer_name='RESULT')),
Window(content=BufferControl(buffer_name='NEW_BUFFER')),
])
在我的项目中,我为所有控制器创建一个基类,在其中初始化数据库连接并注册它们以进行处理。因此,我不仅不会为我的操作编写任何SqlConnection样板,而且不会为任何控制器编写。