当前位置: 首页 > 编程语言 > C#

表示层、业务层和数据层分享

时间:2023-04-10 16:37:55 C#

我无法确切地理解如何。我正在从事一个更侧重于C#的宠物项目,但我不想从任何坏习惯开始。你能看看我有什么,看看我做得对吗?关于如何将所有内容分解成层的任何提示?表达层项目:Ruth业务层使用System;使用System.Collections.Generic;使用System.Linq;使用System.Web;公共类用户{DAda=newDA();公共字符串名字{得到;放;}publicstring}publicstringEmailAddress{get;放;}公共字符串密码{得到;放;}publicstringAccessCode{得到;放;}publicUser(stringfirstName,stringlastName,stringemailAddress,stringpassword,stringaccessCode){FirstName=firstName;姓氏=姓氏;电子邮件地址=电子邮件地址;密码=密码;访问码=访问码;}publicvoidCreateUser(UsernewUser){if(da.IsValidAccessCode(newUser.AccessCode)){da.CreateUser(newUser)使用System.Collections.Generic;使用System.Linq;使用System.Web;使用系统数据;使用System.Data.SqlTypes;使用System.Data.SqlClient;系统。配置;公开课DA{publicDA(){}publicboolIsValidAccessCode(stringaccessCode){boolisValid=false;整数计数=0;使用(SqlConnectionsqlCnn=newSqlConnection(ConfigurationManager.ConnectionStrings["MusicLibraryConnectionString"].ConnectionString)){sqlCnn.Open();使用(SqlCommandsqlCmd=newSqlCommand(String.Format("SELECTCOUNT(*)FROM[AccessCodes]WHERE[accessCode_accessCode]='{0}';",accessCode),sqlCnn)){count=(int)sqlCmd.ExecuteScalar();if(count==1){isValid=true;}}}返回有效;}publicvoidCreateUser(UsernewUser){使用(SqlConnectionsqlCnn=newSqlConnection(ConfigurationManager.ConnectionStrings["MusicLibraryConnectionString"].ConnectionString)){sqlCnn.Open();使用(SqlCommandsqlCmd=newSqlCommand(String.Format("INSERTINTO[Users](user_firstName,user_lastName,user_emailAddress,user_password,user_accessCode)VALUES('{0}','{1}','{2}','{3}','{4}');",newUser.FirstName,newUser.LastName,newUser.EmailAddress,newUser.Password,newUser.AccessCode),sqlCnn)){sqlCmd.ExecuteNonQuery();}}DeleteAccessCode(newUser.AccessCode);}publicvoidDeleteAccessCode(stringaccessCode){使用(SqlConnectionsqlCnn=newSqlConnection(ConfigurationManager.ConnectionStrings["MusicLibraryConnectionString"].ConnectionString)){sqlCnn.Open();使用(SqlCommandsqlCmd=newSqlCommand(String.Format("DELETEFROM[AccessCodes]WHERE[accessCode_accessCode]='{0}';",accessCode),sqlCnn)){sqlCmd.ExecuteNonQuery();}}}}Jon,首先要了解的是,如果您打算构建基于层的应用程序,那么您不应该将SQL语句直接存储在ASPX页面中(如SqlDataSource所要求的那样)构建SqlDataSource控件是为了演示它是多么容易它是使用数据库对应用程序进行数据绑定和更新,并且不打算在现实世界的应用程序中使用,因为如果您打算使用BL层和数据层,它将失败。在ASPX页面中存储选择/更新/删除/插入语句。基于层的应用程序设计的全部目的是封装每一层,这样就没有交集。每一层都与其他层的公共接口交互,并且对其内部实现一无所知。因此,一个可行的替代方法是使用ObjectDataSource控件。此控件允许您直接绑定到DataLayer或Biz逻辑层,后者又可以调用Datalayer。直接绑定到数据层的缺点是您将返回公开数据库表架构的数据结构(例如,DataTables或DataViews)。因此,推荐的逻辑流程如下:ASPX页面使用DataSource控件绑定到BL类。此BL类提供适当的函数,例如GetData、UpdateData、DeleteData和InsertData(具有任何必需的重载),它们返回ObjectDataSource可以使用和显示的强类型对象或集合。BL类中的每个公共函数都在内部调用DataLayer来选择/更新/删除/插入数据库中的数据。快速入门PS中提供了对ASP.NET中基于层设计的出色介绍:@Andy提到了适用于所有场景的通用数据层。有关它可能是什么样子的示例,请参阅此问题。ASP.NET应用程序中逻辑层的最佳解释来自两个来源。第一个是Microsoft自己的ASP.NET站点,由ScottMitchell编写,它很好地介绍了逻辑分离。教程很长,但我发现它们非常有用。URL是http://www.asp.net/learn/data-access/。我发现非常有用的第二个资源是由ImarSpaanjaars编写的,可以在此处找到。这是一篇更具技术性的文章,但提供了一种向应用程序添加结构的好方法。我希望这有帮助。伊恩。如果您编写最终可移植的代码,您会发现您的应用程序中有3个(或更多!)层。例如——不要让你的数据访问层专门为这个应用程序工作,编写它以便你永远不必再次编写它。确保所有函数都可以传递变量并且不依赖于全局变量(或尽可能少)。当您的下一个项目到来时-复制并粘贴您的DAL,突然间您又开始运行了。它并没有就此结束——您可能想为DAL编写一个子层,以说明MySQL和MSSQL之间的区域(仅作为示例)。或者您可能有一个常用功能库,例如文本卫生或CSS生成等。如果您编写代码以便有一天,您坐下来编写一个应用程序——主要涉及剪切和粘贴以前的代码——你已经实现了程序员必杀技。?分层应用背后的整体思想是每一层都不依赖于下面各层的实现细节。例如,在您的代码中,您在表示层中有一个T-SQL语句。这意味着您的表示层与数据库(底层)直接相关。如果您在数据库中进行更改,则还必须在表示层中进行更改。理想情况下,这不是您想要的。表示层应该只关心呈现数据,而不是如何检索数据。假设您要将整个数据库移动到CSV文件(我知道这是个疯狂的想法),您的表示层根本不应该知道这一点。理想情况下,您有一个业务层方法,它只返回您想要显示给用户的数据。您应该查看ObjectDataSource而不是SqlDataSource。SqlDataSource适用于小型原型项目,但您不应该将它用于任何更严肃的项目。您应该在业务层和数据层之间有类似的分离。数据层负责从某个存储位置(数据库、CSV文件、Web服务...)获取所需的数据。此外,理想情况下,业务层不应依赖于数据层的实现细节。例如,如果您正在与SQLServer对话,则不应将SqlDataReader实例返回到业务层。通过这样做,您创建了业务层对数据层实现细节的依赖:它从中检索数据的实际数据库。在实践中,您会发现业务层确实在某种程度上依赖于数据层的实现细节,通常这不是一件坏事。您最后一次决定何时切换数据库是什么时候?但是,尽可能消除依赖关系并隔离实现细节几乎总能使应用程序更易于维护和理解。您可以在此处找到类似的解释。除了他的问题的要点之外,我建议您查看ASPNET_REGSQL以配置您的SQL数据库以处理.Net的内置成员资格/配置文件/角色功能。它会消除创建/更新用户等过程中的许多麻烦和麻烦。我没有经常使用配置文件,但它允许您“为您的用户”添加额外的属性,例如AccessCode。如果您正在处理一个已经执行用户身份验证等操作的现有数据库结构,您可以创建一个自定义成员资格提供程序,它将利用现有的数据库表和存储过程。以上就是C#学习教程:表现层、业务层和数据层分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: