如何将datareader值从DAL传递到表示层

时间:2013-01-24 13:12:10

标签: c# asp.net 3-tier

我正在使用3层架构开展项目。 我想了解如何将数据引导器值从DAL传递到表示层

我的代码是这样的。 在DAL层

public class HomeDAL
{
 public SqlDataReader DefaultSearchFriends(long userid)
 {
    SqlConnection SocialConn = new SqlConnection(connstr);

    using (SqlCommand comm = new SqlCommand("proc_FriendsSearch", SocialConn))
    {
        comm.CommandType = CommandType.StoredProcedure;
        comm.Parameters.AddWithValue("@userid", userid);
        SocialConn.Open();
        SqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection);
        return dr;
    }
 }
}

在BAL层

public class HomeBAL
{
    public SqlDataReader DefaultSearchFriends(long userid)
    {
       HomeDAL HDAL = new HomeDAL();
       SqlDataReader dr = HDAL.DefaultSearchFriends(userid);
       return dr;
    }
}

On Presentaion Layer我在Page load

上写了这个
HomeBAL HBAL = new HomeBAL();
SqlDataReader dr = HBAL.DefaultSearchFriends(user_id);
while (dr.Read())
{ 
 //some code
}

现在我想知道两件事

1-以这种方式调用datareader是否正确,或者有更好的逻辑。

2-如何关闭BAL层和DAL层中的datareader对象。

3 个答案:

答案 0 :(得分:4)

嗯,分层架构的基本思想是出于几个原因解耦不同的组件。 一些原因是可测试性,可维护性,可扩展性,但还有更多。

要在这些层之间传递数据 - 这取决于数据的类型 - 但通常你会使用一些简单的类作为数据传输对象(DTO),它将填充DAL中的数据。 E.g。

public class Person
{
  public string Name {get; set;}
  public string FirstName {get; set;}
  ...
}

根据您的方法,您打破了这个想法,因为您将DataReader传递给表示层,这意味着您无法在不触及其他图层的情况下切换DAL技术。例如。如果您想使用Entity Framework,则必须修改代码中的每个部分,当前正在使用SqlDataReader

您还可以看到,如果您坚持分层方法背后的想法,您不必考虑第二个问题。

我希望这会有所帮助。

修改

好的,我有点好奇,你找不到合适的解决方案。但无论如何,第一个也是最简单的方法可能是,不要发布SqlDataReader。处理DAL中的生命周期。假设您正在使用我的DTO

public class HomeDAL
{
 public List<Person> DefaultSearchFriends(long userid)
 {
    SqlConnection SocialConn = new SqlConnection(connstr);

    using (SqlCommand comm = new SqlCommand("proc_FriendsSearch", SocialConn))
    {
        comm.CommandType = CommandType.StoredProcedure;
        comm.Parameters.AddWithValue("@userid", userid);
        SocialConn.Open();
        SqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection);

        var persons = new List<Person>();

        while (dr.Read())
          persons.Add(new Person { Name = dr["Name"], FirstName = dr["FirstName"] });

        dr.Close();

        return persons;
    }
 }
}

将是更好的方法。

答案 1 :(得分:0)

我认为您的架构存在问题;

  1. 您正在使用具体类来查询数据库;相反,如果您更改后端SQL服务器或查询机制,则需要抽象。

  2. 您正在将具体SqlDataReader传递到所有图层中。从DAL,您需要返回数据对象而不是db操作上下文实例。

  3. 您只需要更改图层之间的域对象,而不是实际工作的对象。

  4. 我建议你参考n layer reference application of microsoft spain

答案 2 :(得分:0)

IN DAL文件

public class HomeDAL
{
  public void DefaultSearchFriends(ref HomeBAL hBAL)
  {
    SqlConnection SocialConn = new SqlConnection(connstr);
    using (SqlCommand comm = new SqlCommand("proc_FriendsSearch", SocialConn))
    {
        comm.CommandType = CommandType.StoredProcedure;
        comm.Parameters.AddWithValue("@userid", hBAL.userid);
        SocialConn.Open();
        hBAL.Search_Reader = comm.ExecuteReader(CommandBehavior.CloseConnection);
    }
  }
}

在BAL档案中

public class HomeBAL
{
public SqlDataReader Search_Reader = null;
}

和在Presentaion图层

 HomeBAL HBAL = new HomeBAL();
HomeDAL HDAL = new HomeDAL();
HDAL.DefaultSearchFriends(ref HBAL);
SqlDataReader dr = HBAL.Search_Reader;    
while (dr.Read())
{
}