在3层架构中执行验证

时间:2014-06-25 08:44:41

标签: c# winforms

我们在哪个层进行验证 如果我在bll层执行我不能使用像messagebox这样的功能 这个程序工作正常我需要执行验证你们可以帮助我只是为fname执行验证,如果它是null或不 在bll类

public void InsertEmployee(string fname, string lname, string alias, 
                           string contact, string address, string company,
                           string bdate, string email)
{

    try 
    {
        obj.InsertEmployee(fname,lname,alias,contact,address,company,bdate,email);
    }       
    catch (Exception ex)  
    {  
        throw ex;  
    }  
}

在Dal课程中

public void InsertEmployee(string fname, string lname, string alias,
                           string contact, string address, string company, 
                           string bdate, string email)
{
    string query;
    try  
    {
        query = "insert into cntc_employee values('" + fname + "','" + lname + "','" + alias + "','" + contact + "','" + address + "','" + company + "','" + bdate + "','" + email + "')";
        OpenCnn();
        cmd = new SqlCommand(query, con);
        cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally 
    {
        CloseCnn();
    }
}

在我的ui课程中

private void cmdins_Click(object sender, EventArgs e)
{
    string fname = txtfname.Text;
    string lname = txtlname.Text;
    string alias = txtalias.Text;
    string contact = txtcon.Text;
    string address = txtadd.Text;
    string company = txtcomp.Text;
    string date = datetimepicker.Value.ToShortDateString();
    string email = txtemail.Text;
    try
    {
        obj.InsertEmployee(fname,lname,alias,contact,address,company,date,email);
        MessageBox.Show(txtfname.Text.Trim() + " employee is successfully added.");
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message.ToString());
    }
}

2 个答案:

答案 0 :(得分:0)

简而言之,无处不在。当然,有一个更长的答案,从&#34开始;它取决于..."但让我们专注于简洁明了的简短回答。您的客户端可以执行验证,但您的业务逻辑层是否信任该客户端?其他客户怎么样?数据库本身将具有约束,字符串长度等。

所以,基本上你需要把它放在任何有意义的地方。是的,会有一些重复,但比一些垃圾数据更好地进入数据库并进一步破坏其他东西。

答案 1 :(得分:0)

验证是恕我直言的商业问题,所以它就是它所属的地方。

返回验证结果的方法是不同的问题。所以不,您的业务层不应该执行MessageBox.Show,这应该只在您的UI层中完成。但是,您可以将字符串中的validation-result返回到您调用业务层的UI层,并在那里显示消息框。另一个选择是抛出验证异常,并在UI层中捕获它。

是的,您也可以在合理的地方执行其他地方的验证。例如,当用户单击保存按钮时,您可以对视图执行客户端验证,这样响应速度会更快,并且更加用户友好。

更新

要在业务层添加验证,一个选项就是这样做。

注意:这是一种相当简单的直接方法。

注意:我已经删除了你在catch中执行throw ex的try-catch。你以这种方式放弃堆栈跟踪,因为你没有真正处理异常,所以可以完全删除它。

// Add reference to System.ComponentModel.DataAnnotations if necessary
using System.ComponentModel.DataAnnotations;

public void InsertEmployee(string fname, string lname, string alias, 
                           string contact, string address, string company,
                           string bdate, string email) {
    ValidateEmployee(fname,lname,alias,contact,address,company,bdate,email);
    obj.InsertEmployee(fname,lname,alias,contact,address,company,bdate,email);
}

private void ValidateEmployee(string fname, string lname, string alias, 
                              string contact, string address, string company,
                              string bdate, string email) {
    var validationErrors = new List<string>();
    if (string.IsNullOrEmpty(fname))
        validationErrors.Add("First name is a required field.");
    if (string.IsNullOrEmpty(lname))
        validationErrors.Add("Last name is a required field.");
    // Etc... add other validations

    if (validationErrors.Any()) {
        throw new ValidationException(string.Join(" ", validationErrors));
    }
}

请注意,您的初始设置可以大大改善。比如:

  • 创建表示域对象的类(又名实体)。从您的示例:添加一个类Employee,它具有FName,LName,Alias等属性
  • 在您现在编写所有变量的任何地方使用这些类。很简单。
  • 在表单中使用数据绑定以消除所有txtsomething.Text = fname,反之亦然。
  • 使用参数化查询。或者更好的是,使用组件将实体保存到数据库 ORM 。一个例子是实体框架