2011-01-19 55 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; } 
    } 

对于这种风格我的数据获取方法行不通了:

服务层做的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 2011-01-19 20:57:10

+0

这不是你的代码示例:)你有其他的选择。延迟加载是我的选择,如果你的加载程序在同一个程序集中,那么内部私有的作用域可能会起作用。 – Neil 2011-01-19 21:19:27