通过中的数据库初始化派生类.NET



假设我有一辆只有一个属性的对象车:Model

我将使用数据库填充对象,如下所示:

Public Class Car
    Public Property Model() As String
        Get
            Return _Model
        End Get
        Set(ByVal value As String)
            _Model = value
        End Set
    End Property
    Private _Model As String
    Private Sub SetObjectData(ByVal theObjReader As System.Data.SqlClient.SqlDataReader)
        Try
            Me._Model = theObjReader("Model").ToString()
        Catch ex As Exception
            Throw New Exception("Unable to Initialize Car.")
        End Try
    End Sub
    Public Sub New(ByVal Car_ID As Integer)
        Dim connection As New SqlConnection(DBTool.DataConnectionString)
        Try
            Dim cmd As SqlCommand
            cmd = New SqlCommand("getCarByCar_ID", connection)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.AddWithValue("@Car_ID ", Car_ID)
            connection.Open()
            Dim objReader As SqlDataReader = cmd.ExecuteReader()
            Do While objReader.Read()
                SetObjectData(objReader)
            Loop
            objReader.Close()
            connection.Close()
        Catch ex As Exception
            connection.Close()
        End Try
    End Sub
End Class

现在,为了论证起见,让我们假设这个类被封装在DLL中。

我想做的是继承它,同时花费我的财产。例如,假设我们想要一个具有新属性"Price"的新对象"Expensive_Car"。

如何在不写两次代码的情况下,利用以前的Car对象并以最"有组织"的方式初始化这个派生类?字段"价格"与字段"模型"保存在同一SQL表中。当然,我们需要从数据库中获得"价格",就像我们提取模型一样。

我的目标是利用现有的类,并在不更改父类的情况下使用新的派生类来扩展它们。SQL数据库结构可以根据需要使用其他字段进行更改。

谢谢!

Nick

您可能需要考虑许多ORM中的一个,比如Entity Framework或NHibernate。

如果你真的想要一个滚动自己的方法,从这里开始最简单的方法可能是向基类添加两个protected overridable方法,一个是用正确的存储过程名称创建SqlCommand对象,另一个是加载特定于派生类的属性。

您可能还应该将连接、命令和数据读取器对象的创建封装在Using语句中,以确保所有内容都得到正确清理。

这里有一个c#示例,因为我的VB.Net真的很生疏:

public class Car
{
  public Car(int carId) {
    CarId = carId;
    LoadProperties();
  }
  public int CarId { get; set; }
  public string Model { get; set; }
  protected virtual SqlCommand CreateCommand() {
    // Override this method in derived classes to call a different procedure.
    return new SqlCommand("getCarByCar_ID");
  }
  protected virtual void LoadMoreProperties(SqlDataReader reader)
  {
    // Override this method in derived classes to load additional properties.
  }
  private void LoadProperties() {
    using( var connection = new SqlConnection(DBTool.ConnectionString) ) {
      using( cmd = CreateCommand() ) {
        using( var reader = cmd.ExecuteReader() ) {
          // Read Car specific properties
          Model = // get model from reader.

          LoadMoreProperties(reader);
        }
      }
    }
  }
}
public class ExpensiveCar : Car {
  public decimal Price { get; set; }
  protected override SqlCommand CreateCommand() {
    return new SqlCommand("getExpensiveCarByCar_ID");
  }
  protected override void LoadMoreProperties(SqlDataReader reader) {
    Price = // get price from reader.
  }
}

它不会编译,但应该会给你这个想法。您只想让可以更改的部分可重写——调用不同的存储过程并加载特定于派生类的属性。

最新更新