2009-08-10 117 views
5

不知道我是否拥有正确的术语,但我对如何设置我的3层系统有点困惑。数据访问层和业务对象

可以说我有我的数据库中的用户表。

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

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

回答

3

查找一个名为“域驱动设计”的概念 - 使用所谓的存储库模式(如您的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() 

注意:当从BL将数据发送到PL转换DB实体向业务实体如果你想循环使用PL中的数据,那么这是必需的。

相关问题