n层对象映射帮助

时间:2008-11-03 21:00:07

标签: .net orm n-tier-architecture oop

想知道我的方法是否合适或是否可以改进:

Public Class Company  
  private _id as Integer
  private _name as String
  private _location as String

  Public Function LoadMultipleByLocation(Byval searchStr as String) as List(Of Company)
     'sql etc here to build the list
  End Function
End Classs

关于如何对象进行映射的想法?

2 个答案:

答案 0 :(得分:1)

在这种情况下,您将创建公司的实例,然后使用它来返回公司列表?

有些人这样做,但我更喜欢将我的数据对象分成一个哑数据容器:

public class Company : EntityBase
{
     private int _id;
     private string _name;
     private string _location;
}

我使用一个基类(EntityBase),它包含将哑实体转换回SQLParameters集合(用于持久化)的常用方法,以及从传入的SQLReader中实例化它(这在每个具体类中被覆盖,将阅读器映射到私有变量。)

然后我更喜欢使用实际进行数据库调用的“Service”类,创建适当的实体对象并返回它,我可以利用多态来减少代码重复。

答案 1 :(得分:0)

@丹

EntityBase将是每个实体对象将继承的基类,如:

public class EntityBase
{
     public virtual string SaveSproc { get; }

     public virtual void LoadFromReader(SqlReader reader)
     {
     }

     public virtual void Save()
     {
         List<SqlParameters> paramList = = this.CreateParamsList();
         DoSqlStuff(this.SaveSproc, paramList);
     }

     public virtual List<SqlParamenter> CreateParamsList()
     { 
          return new List<SqlParameter>
     }
}

public Company : EntityBase
{

    private string _data;

public override string SaveSproc { get { return "SprocThatSaves"; } }

    public override List<SqlParameter> CreateParamList()
{   
    List<SqlParameter> param = new List<SqlParameter>
    param.Add(new SqlParameter("Data",_data);

    return param;   
}

public override void LoadFromReader(SqlReader reader)
{
    // PsuedoCode
    _data = reader["data"];
}
}

现在,您的数据库层可以为读者提供公司数据,并执行以下操作:

Company = new Company();
Company.LoadFromReader(reader);

在其他地方,为了保存您的数据:

Company.Save();