Уровень доступа к данным и бизнес-объекты

Не уверен, что у меня правильная терминология, но я немного запутался в том, как настроить мою трехуровневую систему.

Допустим, у меня есть таблица пользователей в моей БД.

В моем DAL у меня есть класс UserDB, который вызывает хранимые процедуры в БД для вставки, обновления, удаления. У меня также есть класс UserDetails, который используется в UserDB для возврата и передачи объектов.

Итак, теперь я не знаю, как использовать это на моем уровне бизнес-логики. Нужен ли мне еще один объектный класс BLL для пользователей? Если да, то разве это не будет лишним? Или я просто использую класс UserDetails во всем моем BLL?


person Ashish    schedule 10.08.2009    source источник


Ответы (3)


Найдите концепцию под названием «Domain Driven Design» - самая важная вещь, которая существует с использованием так называемого шаблона репозитория (например, вашего класса UserDB) в качестве адаптера к базе данных, а также фабрики. Затем ваши бизнес-объекты или объекты домена включают в себя бизнес-логику и могут обрабатывать взаимодействия с другими бизнес-объектами.

Какую технологию вы используете? Что-то вроде ActiveRecord, вероятно, может вам сильно помочь.

person Luke Schafer    schedule 10.08.2009

Обычно вы обеспечиваете соблюдение бизнес-правил в своем 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;
    }
}
person Eric J.    schedule 10.08.2009

Вы можете использовать следующий дизайн:

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 в сущность Business, если вы хотите зациклить эти данные в PL.

person Paul    schedule 24.02.2012