Использование LINQ с разными слоями означает, что я не могу получить доступ к определенному типу - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть 3 уровня в моем решении:

  • DAL (который обращается к моей БД с помощью LINQ)
  • Бизнес-уровень
  • Winform

В моем DAL я возвращаю List с определенным типом из моей БД, и я делаю то же самое в моей BLL.

Когда я хочу использовать свою функцию в своем пользовательском интерфейсе, яполучить ошибку:

Тип 'Резервирование' определен в сборке, на которую нет ссылок ...

Теперь я хочу избежать ссылки на мой DAL вмой пользовательский интерфейс.

Поскольку я новичок в этом и не смог найти четкого ответа в Интернете, кто-нибудь может мне помочь, пожалуйста?

Моя функция DAL

public static List<Reservation> SelectListReservation()
{
    try
    {
        List<Reservation> lstReservation = new List<Reservation>();
        lstReservation = oExamenSgbdEntities.Reservations.ToList();
        return lstReservation;
    }
    catch (Exception e)
    {
        throw e;
    }
}

Моя функция BLL

public static List<DataAccess.Reservation> GetListReservation()
{
    try
    {
        List<DataAccess.Reservation> lstToReturn = new List<Reservation>();
        lstToReturn = GetListReservation();
        return lstToReturn;
    }
    catch (Exception e)
    {
        throw e;
    }
}

Как я вызываю свою функцию BL в моем пользовательском интерфейсе:

var lstRes = Manage.GetListReservation();

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Одним из решений является создание библиотеки объектов передачи данных (DTO), которые обертывают объекты из уровня данных, поскольку они определены в отдельной сборке.Затем бизнес-уровень может выполнять вызовы в базу данных и преобразовывать результаты в эти новые классы.

Это нарушает зависимость между уровнем презентации и уровнем данных, а также позволяет настраивать то, что вы предоставляете из данных -> Бизнес и / или Бизнес -> Презентация (вы можете объединить несколько объектов из базы данных в один, и вы можете показать гораздо меньшие объекты, где это возможно).

Подробнее об этом можно прочитать здесь: Создание объектов передачи данных (DTO)

0 голосов
/ 14 декабря 2018

Из подробностей вашего вопроса похоже, что вы используете Традиционную N-слойную архитектуру .В этой архитектуре уровень пользовательского интерфейса зависит от BLL, а BLL зависит от DAL.Это должна быть ваша справочная структура: проект пользовательского интерфейса ссылается на проект BLL, а проект BLL ссылается на проект DAL.

Для вас это означает, что вы не можете использовать классы из DAL в своем пользовательском интерфейсе;пользовательский интерфейс не должен знать о реализации DAL, потому что DAL может измениться (например, перейти от базы данных SQL Server к базе данных Oracle).Поэтому для передачи данных из DAL в BLL вам необходимо создать класс модели в вашей BLL и сопоставить с ним все данные из класса DAL.

Например, в вашей BLL вам нужночтобы добавить класс ReservationModel, который будет сопоставлен с классом Reservation в вашем DAL:

public class ReservationModel
{
    // Add the same properties that are in the Reservation class in 
    // the DAL to this class. The properties below are just for example
    public int ReservationId { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public int CustomerId { get; set; }
}

Затем в BLL измените метод GetListReservation(), чтобы он возвращал ReservationModel со всеми сопоставленными даннымииз класса Reservation в DAL:

public static List<ReservationModel> GetListReservation()
{
    var reservationModels = new List<ReservationModel>();

    foreach (var reservation in SelectListReservation())
    {
        reservationModels.Add(new ReservationModel
        {
            // Again, these are made-up properties for illustration purposes
            ReservationId = reservation.ReservationId,
            StartDate = reservation.StartDate,
            EndDate = reservation.EndDate,
            CustomerId = reservation.CustomerId
        });
    }

    return reservationModels;
}
0 голосов
/ 14 декабря 2018

Если вы врезаете, DAL, BL и P, ваш метод BL не может вернуть тот же тип, что и ваш DAL.

P использует BL, а BL использует DAL

Следовательно, Pабстрагируется от DAL

Резервирование должно использоваться только BL, если оно содержится в DAL

Разделить ваш тип DAL и тип BL или выбрать другую архитектуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...