不确定我是否有正确的术语,但我对如何设置3层系统感到有些困惑。
假设我的数据库中有一个用户表。
在我的DAL中,我有一个UserDB类,它将存储过程调用到DB中以插入,更新,删除。 我还有一个UserDetails类,在UserDB中用于返回和传入对象。
所以现在我不确定如何在我的业务逻辑层中使用它。我是否需要为用户提供另一个BLL对象类?如果是这样,这不是多余的吗? 或者我只是在我的BLL中使用UserDetails类?
答案 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,将数据库实体转换为业务实体。