gpt4 book ai didi

c# - 如何将数据读取器值从 DAL 传递到表示层

转载 作者:行者123 更新时间:2023-11-30 15:35:46 25 4
gpt4 key购买 nike

我正在从事一个使用 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;
}
}

在 Presentaion Layer 我在页面加载时写了这个

HomeBAL HBAL = new HomeBAL();
SqlDataReader dr = HBAL.DefaultSearchFriends(user_id);
while (dr.Read())
{
//some code
}

现在我想知道两件事

1- 以这种方式调用datareader 是正确的还是有一些更好的逻辑。

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

最佳答案

好吧,出于多种原因,分层架构的基本思想是分离不同的组件。一些原因是可测试性、可维护性、可扩展性,但还有更多原因。

要在这些层之间传递数据——嗯,这在一定程度上取决于数据的种类——但通常您会使用一些简单的类作为数据传输对象 (DTO),这些类将在 DAL 中填充数据。例如

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;
}
}
}

会是更好的方法。

关于c# - 如何将数据读取器值从 DAL 传递到表示层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14502181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com