Web API - 如何正确配置SQL连接?

时间:2015-02-01 00:14:14

标签: asp.net asp.net-web-api asp.net-web-api2 sqlconnection

我有一个简单的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()覆盖中,因为我想写一次

  • 我可以确定在任何情况下都会调用处理代码吗? (例外情况 例子)。

  • 我可以确定控制器将在处理 呼吁行动结束,释放资源即将到来 呼叫。

  • 如果没有,是否有更强大/更正确的方法呢?

2 个答案:

答案 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样板,而且不会为任何控制器编写。

相关问题