2011-01-19 3 views
0

Обычно я думал, что этот код хороший дизайн:Архитектурные бизнес-коллекции с частным сеттером в сервисный слой

Посмотрите на частный сеттер для коллекции. Поэтому никто не может назначить новую коллекцию извне объекта schoolclass.

public class Schoolclass 
    { 
     public Schoolclass() 
     { 
      Pupils = new List<Pupil>(); 
     }    

     public int SchoolclassId { get; set; } 
     public string SchoolclassCode { get; set; } 

     public List<Pupil> Pupils { get; private set; } 
    } 

Что касается этого стиля мои данные метод, забирающий больше не работает:

Service Layer делает вызовы к поставщику SQLite данных:

BL:

public IEnumerable<Schoolclass> GetAdministrationData() 
     { 
      var schoolclasses = adminDataProvider.GetSchoolclassList(); 
      foreach (Schoolclass s in schoolclasses) 
      { 
       var pupils = adminDataProvider.GetPupilsBySchoolclassId(s.SchoolclassId); 
       s.Pupils = pupils; 

       foreach (Pupil p in pupils) 
       { 
        var documents = adminDataProvider.GetDocumentsByPupilId(p.Id); 
        p.Documents = documents; 
       } 
      } 
      return schoolclasses; 
     } 

Если у меня будет теперь частный сеттер, вышеперечисленное объединение не будет работать.

У меня есть другой выбор? Или я должен придерживаться техники загрузки?

ответ

1

Да вы у вас есть нагрузки вариантов:

Добавить зрачки уже созданный список.

var pupils = adminDataProvider.GetPupilsBySchoolclassId(s.SchoolclassId); 
s.Pupils.AddRange(pupils); 

foreach (Pupil p in pupils) 
{ 
    var documents = adminDataProvider.GetDocumentsByPupilId(p.Id); 
    p.Documents.AddRange(documents); 
} 

Обратите внимание, что это своего рода плохой форме, чтобы выставить List<T> - Лучше выставить Collection<T> хотя тогда вам придется добавить элементы один за другим.

Если вы пишете вам парень, как это:

public class Schoolclass 
{ 
    public Schoolclass() 
    { 
     Pupils = new BindingList<Pupil>(); 
      // binding list descends from Collection<T> 

    }    

    public int SchoolclassId { get; set; } 
    public string SchoolclassCode { get; set; } 

    public Collection<Pupil> Pupils { get; private set; } 
} 

Конечно есть 1,000,000 пути и многое другое, чтобы написать это и загрузчик. Я предпочитаю ленивую загрузку. Затем, когда вы загружаете их только тогда, когда кто-то просит учеников.

+0

Я возвращаю IEnumerable , поэтому я не могу сделать .AddRange() – Elisabeth

+0

Это не то, что вы используете для кода образца. У вас есть другие возможности. Я бы выбрал ленивую загрузку, внутренняя частная область видимости может работать, если ваш загрузчик находится в одной сборке. – Neil

+0

Почему список против коллекции плохо? Никогда не читал этого. И это не имеет смысла. Я предпочитаю загружать все, потому что у меня есть данные, кроме того, я использую WPF, который связан с привязкой данных. подключите коллекцию учеников к выбранному школьному классу, вызывая проблемы с привязанностью, как это было в прошлые времена. Лучше всего вернуть IEnumerable , потому что его интерфейс. – Elisabeth

1

Это вопрос immutability. Свойство List<Pupil> по-прежнему изменено, даже с помощью частного сеттера.

Я не могу установить свойство учеников непосредственно:

myclass.Pupils = new List<Pupil>();

... но я могу изменить это:

var myClass = new SchoolClass(); 
myClass.Pupils.Add(new Pupil()); 

Вот хорошая статья обсуждает различные типы неизменность в C#:

http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one-kinds-of-immutability.aspx

+0

спасибо за ссылку wiki, у меня нет C#: P Я просто пытаюсь классифицировать сообщение о том, что эппер-липпер попал в мою проблему с прямым приватным сеттером. Вы говорите, что я могу изменить его ... с .Add() Хорошо, что тогда хорошо для вас? Не добавит ли вред неизменности? Поскольку он не меняет/не устанавливает новый список, он кажется мне неизменным. – Elisabeth

Смежные вопросы