Использование списка объектов для передачи между слоями проекта (C #)

#c# #oop

#c# #ооп

Вопрос:

В проекте C # (Visual Studio 2010) у меня есть класс с большим количеством свойств, и я заполняю объекты этого класса данными и добавляю объект в список, чтобы передать его для отображения списка элементов (что-то вроде результатов поиска). Моя проблема в том, что мне не нужны все свойства класса для отображения приведенного выше списка, так что мне нужно создать другой класс только с обязательным полем для отображения списка (результатов)? Правильно ли это в соответствии с концепциями ООП?

Комментарии:

1. Дорого ли перемещать данные между слоями?

Ответ №1:

Ваш объект properties может реализовывать несколько интерфейсов, как того требуют разные части вашей программы.

Если вы определяете эти интерфейсы:

 public interface IBasicInfo
{
    string Name { get; }
    string Id { get; }
}

internal interface IFullInfo : IBasicInfo
{
    string Address { get; }
}

internal interface IInternalStuff
{
    Stuff Data { get; }
}
  

И ваш класс свойств реализует их следующим образом:

 internal class Properties : IFullInfo, IInternalStuff
{
    // some basic implementation
}
  

Затем вы можете передать этот класс в другую часть вашего приложения, которая имеет метод, подобный этому:

 public void Display(IBasicInfo info)
{
   ...
}
  

И вызывающий код будет видеть только свойства, которые принадлежат IBasicInfo . Обратите внимание, что IBasicInfo он должен быть общедоступным, и даже Properties класс является внутренним, чтобы гарантировать, что никакой вызывающий код не сможет вернуться к фактической реализации и испортить ее.

В качестве альтернативы, если ваш вызывающий код содержит совершенно разные интерфейсы, то вполне разумно преобразовать их в объекты передачи данных и даже изменить их содержимое в соответствии с ожиданиями вызывающего (шаблон адаптера). Существуют инструменты, которые автоматизируют эту задачу (например, Automapper).

Ответ №2:

Я думаю, да, это называется объектом передачи данных

Ответ №3:

Вы можете рассмотреть возможность использования такого решения, как automapper, для сопоставления класса, имеющего N количество свойств, с другим классом, имеющим M количество свойств. Он опирается на некоторую обычную информацию (то же / похожее имя), но также может быть изменен.

Это довольно стандартный способ получения данных модели, извлеченных из базы данных, и преобразования их во что-то, что может отображаться в представлении на веб-странице. Я создаю «viewmodel», в котором есть только то, что я хочу отобразить, что обычно является подмножеством полей, а затем сопоставляю между ними. Что-то вроде automapper позволяет довольно легко это сделать.

Ответ №4:

Поскольку у вас есть ссылочный тип (класс), передача исходного объекта вместо нового объекта, содержащего подмножество данных, не должна быть дорогостоящей.

Если вы хотите защитить объект от манипулирования получателем списка, вы можете определить интерфейс только для чтения для класса и передать его как таковой.