数据访问层和业务对象

时间:2009-08-10 02:44:38

标签: data-access-layer

不确定我是否有正确的术语,但我对如何设置3层系统感到有些困惑。

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

在我的DAL中,我有一个UserDB类,它将存储过程调用到DB中以插入,更新,删除。 我还有一个UserDetails类,在UserDB中用于返回和传入对象。

所以现在我不确定如何在我的业务逻辑层中使用它。我是否需要为用户提供另一个BLL对象类?如果是这样,这不是多余的吗? 或者我只是在我的BLL中使用UserDetails类?

3 个答案:

答案 0 :(得分:4)

查找一个名为“域驱动设计”的概念 - 最重要的是使用所谓的存储库模式(例如您的UserDB类)作为数据库的适配器以及工厂。然后,您的业务对象或域对象将业务逻辑合并到自身中,并可以处理与其他业务对象的交互。

您使用的是哪种技术?像ActiveRecord这样的东西可能对你有很大帮助。

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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中循环数据,则需要将数据从BL发送到PL,将数据库实体转换为业务实体。