例如用户注册的时候
1 判断用户是否存在
2 插入数据2显然是dal的责任
但1呢
如果放在dal
那1 2就可以放在同一个sql中效率比较高
但感觉应该放在bll中判断才符合结构遇到类似的问题该怎么办呢
有没有相关的判断标准
1 判断用户是否存在
2 插入数据2显然是dal的责任
但1呢
如果放在dal
那1 2就可以放在同一个sql中效率比较高
但感觉应该放在bll中判断才符合结构遇到类似的问题该怎么办呢
有没有相关的判断标准
解决方案 »
- .net2.0CSS规范问题
- DataGrid导出Excel的问题
- 请问:ASP.NET里的session的值还未超时就被清空,这是什么原回啊(急,解决加一百分)
- gridview的编辑格式问题?
- 关于后台调用dialog以及关于线程问题
- 请问表示层和逻辑层应该怎么分呢?各写些什么?
- 新人求教个问题,关于数据绑定的
- (高分相送!)crystal report for .net 在asp.net项目布署后生成的图形报平看不见图片?有遇到过这样的问题吗?
- 有没有办法让所有页面都转向一个页面呢??
- 安装项目的制作问题(Setup.ini的配置问题)
- ASP.NET有谁做过DataSet导出为记事本文件,给点意见!在线急等!
- 新手求助
在bll里写判断的函数,调用在dal里面的方法
这是肯定的
但判断应该在bll还是dal呢
就是说 判断该用户是否能注册
这个工作到底是谁的责任ps:我只是举一个例子,并不是在讨论程序本身的问题,而是讨论责任的问题
我是想知道在一些责任分配比较模糊的地方要有怎么样的标准
不然就只会推卸责任了
也就是說在bll中判斷我的理解
界面层 登录时需要验证帐号密码
业务逻辑层就 调用 帐号密码的方法 把帐号密码传过去
数据访问层就 写具体的Select方法 返回结果集
业务层不需要知道数据是怎么来的,只需要得到结果,具体怎么来的数据,那是数据层的事。
你可以把数据层写成,直接返回取数据的
bool GetUser(string Name,string Pwd)
{
//数据读取,返回bool值
}也可以一个通用的取数据方法,然后通过业务层来判断是否正确。具体怎么用看你项目的需求。总之分层是为了让项目更灵活,复用性更高,而不是滥用设计。
第一次贴代码.现丑了.
首先是存储过程,这是部分代码.注意返回值.
ALTER PROCEDURE [dbo].[SuperJ_InsertAdmin]
@AdminName nvarchar(63),
@Password nvarchar(63),
@ShowName nvarchar(63),
@IsPass bit,
@IsSingleLogin tinyint
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM SuperJ_Admin WHERE AdminName=@AdminName)
RETURN -1;
IF EXISTS(SELECT * FROM SuperJ_Admin WHERE ShowName=@ShowName)
RETURN -2;
INSERT INTO [dbo].[SuperJ_Admin]
([AdminName]
,[Password]
,[ShowName]
,[IsPass]
,[IsSingleLogin])
VALUES
(@AdminName,
@Password,
@ShowName,
@IsPass,
@IsSingleLogin) Return 1;
END
这是DAL,插入ADMIN,如果插入不成功.(其实就是影响的行数为0),这时我读取数据库的反回值.-1是帐号重复-2是显示名重复.AdminInfo.是Admin表的MODEL,其实就是把表写成类.只有属性. #region Insert Admin
public int InsertAdmin(AdminInfo ai)
{
using (SqlConnection connection = SQLHelper.GetSqlConnection())
{
SqlCommand command = new SqlCommand("SuperJ_InsertAdmin", connection);
//SqlDataReader reader; command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@AdminName", SqlDbType.NVarChar, 63).Value = ai.AdminName;
command.Parameters.Add("@Password", SqlDbType.NVarChar, 63).Value = ai.Password;
command.Parameters.Add("@ShowName", SqlDbType.NVarChar, 63).Value = ai.ShowName;
command.Parameters.Add("@IsPass", SqlDbType.Bit).Value = ai.IsPass;
command.Parameters.Add("@IsSingleLogin", SqlDbType.TinyInt).Value = ai.IsSingleLogin;
command.Parameters.Add("@ReturnValue", SqlDbType.Int);
command.Parameters["@ReturnValue"].Direction = ParameterDirection.ReturnValue;
connection.Open();
int val = command.ExecuteNonQuery();
connection.Close();
if (val < 1)
{
val = Convert.ToInt32(command.Parameters["@ReturnValue"].Value);
}
return val;
}
}
#endregion这是BLL.他什么也没做. public int InsertAdmin(AdminInfo ai)
{
return dal.InsertAdmin(ai);
}
这是界面 protected void btnSubmit_Command(object sender, CommandEventArgs e)
{
int val;
SuperJ_CMS.Model.AdminInfo ai = new SuperJ_CMS.Model.AdminInfo();
ai = GetFormValue();
SuperJ_CMS.BLL.Admin a = new SuperJ_CMS.BLL.Admin();
if (ai.AdminId <= 0)
val = a.InsertAdmin(ai);
else
val = a.UpdateAdmin(ai); switch (val)
{
case 0:
break;
case -1:
lblAdminNameMsg.Text = "此用户名已经存在,请更换!";
break;
case -2:
lblShowNameMsg.Text = "此显示名已经存在,请更换!";
break;
case 1:
if (e.CommandName == "OK")
{ }
else
{ }
break;
}
}
private SuperJ_CMS.Model.AdminInfo GetFormValue()
{
string adminName = txtAdminName.Text;
string showName = txtShowName.Text;
string password = txtPassword.Text;
string confirm = txtConfirm.Text;
int adminId = this.IdPK;
bool isPass = radlIsPass.SelectedValue == "1" ? true : false;
int isSingleLogin =Convert.ToInt32(radlIsSingleLogin.SelectedValue);
SuperJ_CMS.Model.AdminInfo ai = new SuperJ_CMS.Model.AdminInfo(adminId,adminName, showName, password, isPass, isSingleLogin);
return ai;
}
献丑了.
[Entity("Models.Users", "Users")]
[EntityID(Hanker.Persistence.Attribute.EntityIDType.Identity, "UserCode")]
public class Users
{
private string userCode = string.Empty;
[Field("UserNo",typeof(string),30,1)]
public string UserCode
{
get { return userCode; }
set { userCode = value; }
} private string userName = string.Empty;
[Field("UserName",typeof(string),30,2)]
public string UserName
{
get { return userName; }
set { userName = value; }
} private int id; [Field("ID", typeof(int), 30,true,true)]
public int Id
{
get { return id; }
set { id = value; }
} private string departCode;
[Field("DepartNo", typeof(string))]
public string DepartCode
{
get { return departCode; }
set { departCode = value; }
} private string departName = string.Empty;
[Field("departName", typeof(string),false,false,true)]
[Relation(typeof(Departments), "DepartCode", RelationType.OneToMany)]
public string DepartName
{
get { return departName; }
set { departName = value; }
} private string address;
[Field("address", typeof(string), false, false, true)]
[Relation(typeof(Departments), "DepartCode", RelationType.OneToMany)]
public string Address
{
get { return address; }
set { address = value; }
} }
模型是UI,BAL 联系的主线 ,它贯穿系统整个领域。然后,BAL 接受UI提供的搜索信息,我们暂时用Condition 对象表示例如:
EntityFactory factory = new EntityFactory();
ConditionCollection conditions = new ConditionCollection();
Condition condition = new Condition();
condition.ColumnName = "UserName";
condition.ColumnType = DbType.String;
condition.Symbol = SqlCompareSymbol.Equal;
condition.Value = "Test";
conditions.Add(condition);
List<Users> userList = factory.Query<Users>(conditions);
//判断是否存 的一些处理等等 if (userList.Count>0)
{
}
else
{
}
然后将这些结果 返回UI。在Bal 中使用的ORM组件,它替代了传统意义的DAL。重要的是减少了SQL的出现还有,如果真的把所有判断放置到BAL 中,有些不现实。例如 在输入某模型的长度限制什么的,因为放置到BAL,考虑到有可能是
分布式程序,那么这样会加大网路流量等等。所以具体情况,具体分析。说错了别怪我!