我正在使用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对象。
答案 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)
我认为您的架构存在问题;
您正在使用具体类来查询数据库;相反,如果您更改后端SQL服务器或查询机制,则需要抽象。
您正在将具体SqlDataReader
传递到所有图层中。从DAL,您需要返回数据对象而不是db操作上下文实例。
您只需要更改图层之间的域对象,而不是实际工作的对象。
答案 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())
{
}