数据访问层和业务对象

6

我不确定术语是否正确,但是我有点困惑如何设置我的三层系统。

假设我在我的数据库中有一个用户表。

在我的数据访问层(DAL)中,我有一个UserDB类,它调用存储过程将数据插入、更新和删除到数据库中。 我还有一个UserDetails类,用于在UserDB中返回和传递对象。

现在我不确定如何在我的业务逻辑层(BLL)中使用它。 我需要为用户再创建另一个BLL对象类吗? 如果是这样,这不是多余的吗? 还是我只需在整个BLL中使用UserDetails类即可?

3个回答

4
请查找“领域驱动设计”这个概念-最大的收获是使用所谓的存储库模式(例如您的UserDB类)作为适配器到数据库,以及工厂。您的业务对象或领域对象随后将业务逻辑纳入其自身,并可以处理与其他业务对象的交互。
您使用什么技术?像ActiveRecord这样的东西可能会帮助您很多。

2

通常情况下,您需要在BLL中执行业务规则。例如,您可能允许普通呼叫中心员工提供新服务的10%折扣,但允许经理提供20%的折扣。您需要在BLL中编写类似以下代码的业务规则:

// Pseodocode
double Discount
{
    set
    {
        if (value > 10% AND Employee Is Not Manager) then throw Exception
        if (value > 20%) then throw Exception
        discount = value;
    }
}

0
您可以使用以下设计:
DAL:

namespace DAL.Repository
{
    public class UsersRepository
    {
        public static IList GetUser(string UserId)
        { 
            using(MyDBEntities context=new MyDBEntities())
            {
               // it calls SP in DB thru EF to fetch data
               //here you can also context.user to fetch data instead of SP
                return context.GetUser(UserId).ToList();

            }
        }
    }
}
BLL

namespace BLL
{
   public class User
    {
       public static IList GetUser(string UserId)
       {
           return DAL.Repository.UserRepository.GetUser(UserId);
       }
    }
}
PL

  ddlUser.DataTextField = "UserName";
  ddlUser.DataValueField = "UserId";
  ddlUser.DataSource= BLL.User.GetUser(string.Empty);
  ddlUser.DataBind()

注意:如果您想在 PL 中循环数据,则需要将 DB 实体转换为业务实体,以便从 BL 发送数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接