数据访问层和业务对象

Posted

技术标签:

【中文标题】数据访问层和业务对象【英文标题】:Data Access Layer and Business Objects 【发布时间】:2010-11-18 04:25:00 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

查找一个名为“域驱动设计”的概念——其中最重要的是使用所谓的存储库模式(例如您的 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;
    

【讨论】:

【参考方案3】:

您可以使用以下设计:

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()

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

【讨论】:

以上是关于数据访问层和业务对象的主要内容,如果未能解决你的问题,请参考以下文章

ASP WebApi:服务层、业务层和数据访问层

服务层和数据访问对象层如何适应 Spring MVC 架构?

DAO设计模式

MVC中数据访问层和模型的区别

什么是ORM,以及在php上的使用

业务对象和数据层