如何在C#中实现自定义函数Dispose?
How to implement Dispose to custom function in C#?
我有下面列出的示例 class,我需要在每次调用 API.
时使用 CreateDataConnection() 打开数据库连接
public class FlowerController : ApiController
{
DataConnection oDataConnection { get; set; }
public void CreateDataConnection()
{
ConnectionParameters oParams = new ConnectionParameters();
oParams.strDatabaseName = "123123123123";
oParams.strPassword = "123123123123";
oParams.strSchemaName = "123123123123";
oParams.strServerIP = "192.168.1.1";
oParams.strServerPort = "12313";
oParams.strUsername = "123123123";
oDataConnection = new DataConnection(oParams);
}
[HttpPost]
[AllowAnonymous]
[Route("api/flower/Activate")]
public DBStatus Activate(W_Flower oFlower)
{
CreateDataConnection();
DBStatus result = oDataConnection.Activate(oFlower);
return result;
}
}
我想按如下方式实施激活 API
public DBStatus Activate(W_Flower oFlower)
{
using (CreateDataConnection())
{
DBStatus result = oDataConnection.Activate(oFlower);
}
return result;
}
但这不起作用,因为我在 CreateDataConnection 中没有 dispose 方法。我怎样才能在这里实施处置?这个方法我没做过
这应该有帮助:
public class SomeClass : IDisposable
{
#region IDisposable Support
private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: dispose managed state (managed objects).
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
disposedValue = true;
}
}
// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
// ~SomeClass() {
// // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
// Dispose(false);
// }
// This code added to correctly implement the disposable pattern.
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
// TODO: uncomment the following line if the finalizer is overridden above.
// GC.SuppressFinalize(this);
}
#endregion
}
您可以通过以下方式实现它:
public class MyClass : IDisposable
{
bool disposed;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
//dispose managed resources
}
}
//dispose unmanaged resources
disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
将CreateDataConnection
更改为return新创建的连接,
public DataConnection CreateDataConnection() {
ConnectionParameters oParams = new ConnectionParameters();
oParams.strDatabaseName = "123123123123";
oParams.strPassword = "123123123123";
oParams.strSchemaName = "123123123123";
oParams.strServerIP = "192.168.1.1";
oParams.strServerPort = "12313";
oParams.strUsername = "123123123";
return new DataConnection(oParams);
}
而不是将其存储在 属性 中。
那你就可以
public DBStatus Activate(W_Flower oFlower) {
using (var connection = CreateDataConnection()) {
return connection.Activate(oFlower);
}
}
你需要实现IDisposable接口,之后你就可以有Dispose方法,在Dispose里面写你自己的逻辑就可以了。
我有下面列出的示例 class,我需要在每次调用 API.
时使用 CreateDataConnection() 打开数据库连接public class FlowerController : ApiController
{
DataConnection oDataConnection { get; set; }
public void CreateDataConnection()
{
ConnectionParameters oParams = new ConnectionParameters();
oParams.strDatabaseName = "123123123123";
oParams.strPassword = "123123123123";
oParams.strSchemaName = "123123123123";
oParams.strServerIP = "192.168.1.1";
oParams.strServerPort = "12313";
oParams.strUsername = "123123123";
oDataConnection = new DataConnection(oParams);
}
[HttpPost]
[AllowAnonymous]
[Route("api/flower/Activate")]
public DBStatus Activate(W_Flower oFlower)
{
CreateDataConnection();
DBStatus result = oDataConnection.Activate(oFlower);
return result;
}
}
我想按如下方式实施激活 API
public DBStatus Activate(W_Flower oFlower)
{
using (CreateDataConnection())
{
DBStatus result = oDataConnection.Activate(oFlower);
}
return result;
}
但这不起作用,因为我在 CreateDataConnection 中没有 dispose 方法。我怎样才能在这里实施处置?这个方法我没做过
这应该有帮助:
public class SomeClass : IDisposable
{
#region IDisposable Support
private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: dispose managed state (managed objects).
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
disposedValue = true;
}
}
// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
// ~SomeClass() {
// // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
// Dispose(false);
// }
// This code added to correctly implement the disposable pattern.
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
// TODO: uncomment the following line if the finalizer is overridden above.
// GC.SuppressFinalize(this);
}
#endregion
}
您可以通过以下方式实现它:
public class MyClass : IDisposable
{
bool disposed;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
//dispose managed resources
}
}
//dispose unmanaged resources
disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
将CreateDataConnection
更改为return新创建的连接,
public DataConnection CreateDataConnection() {
ConnectionParameters oParams = new ConnectionParameters();
oParams.strDatabaseName = "123123123123";
oParams.strPassword = "123123123123";
oParams.strSchemaName = "123123123123";
oParams.strServerIP = "192.168.1.1";
oParams.strServerPort = "12313";
oParams.strUsername = "123123123";
return new DataConnection(oParams);
}
而不是将其存储在 属性 中。
那你就可以
public DBStatus Activate(W_Flower oFlower) {
using (var connection = CreateDataConnection()) {
return connection.Activate(oFlower);
}
}
你需要实现IDisposable接口,之后你就可以有Dispose方法,在Dispose里面写你自己的逻辑就可以了。