2012-03-05 126 views
0

對於我們的項目,我們想使用ViewModels。 所以我們決定創建爲每個對象,我們可以的ViewModels:ViewModel多對多關係

因此視圖模型看起來像這樣(GroupVM):

public class GroupVM : EORTCViewModel<Prisma.BO.Group> 
{ 
    public GroupVM(Prisma.BO.Group group) : base(group) { } 

    public string Name 
    { 
     get 
     { 
      return this._Model.Name; 
     } 
    } 
    public string ShortName 
    { 
     get 
     { 
      return this._Model.ShortName; 
     } 
    } 

    public int Id 
    { 
     get 
     { 
      return this._Model.Id; 
     } 
    } 

    [ScriptIgnore] 
    public ICollection<StudyGroupVM> StudyGroups 
    { 
     get 
     { 
      return Prisma.Web.Models.Factories.ViewModelFactory<Prisma.BO.StudyGroup>.ToViewModel<StudyGroupVM>(this._Model.StudyGroups); 
     } 
    } 
} 

的StudyVM:

public class StudyVM : EORTCViewModel<Prisma.BO.Study> 
{ 
    public StudyVM(Prisma.BO.Study study) : base(study) { } 

    public string Number 
    { 
     get 
     { 
      return this._Model.Number; 
     } 
    } 

    [ScriptIgnore] 
    public ICollection<StudyGroupVM> StudyGroups 
    { 
     get 
     { 
      return Prisma.Web.Models.Factories.ViewModelFactory<Prisma.BO.StudyGroup>.ToViewModel<StudyGroupVM>(this._Model.StudyGroups); 
     } 
    } 
} 

和中間目標( StudyGroup):

public class StudyGroupVM : EORTCViewModel<Prisma.BO.StudyGroup> 
{ 
    public StudyGroupVM(Prisma.BO.StudyGroup studyGroup) : base(studyGroup) { } 

    public StudyVM Study 
    { 
     get 
     { 
      return Prisma.Web.Models.Factories.ViewModelFactory<Prisma.BO.Study>.ToViewModel<StudyVM>(this._Model.Study); 
     } 
    } 

    public GroupVM Group 
    { 
     get 
     { 
      return Prisma.Web.Models.Factories.ViewModelFactory<Prisma.BO.Group>.ToViewModel<GroupVM>(this._Model.Group); 
     } 
    } 
} 

我們想使用一個工廠th at會爲每個導航屬性創建ViewModels。

所以我們寫了一個通用的視圖模型工廠如下:

public static class ViewModelFactory<T> where T : IEORTCObject 
{ 
    public static R ToViewModel<R>(T model) where R : EORTCViewModel<T> 
    { 
     return (R)Activator.CreateInstance(typeof(R), new object[] { model }); 
    } 

    public static ICollection<R> ToViewModel<R>(ICollection<T> models) where R : EORTCViewModel<T> 
    { 
     ICollection<R> viewModels = new List<R>(); 
     foreach (T model in models) 
     { 
      viewModels.Add((R)Activator.CreateInstance(typeof(R), new object[] { model })); 
     } 
     return viewModels; 
    } 
} 

的問題是,當我們試圖從關係的結束對象的一個​​訪問StudyGroups屬性,它創建正確的對象,但隨後想要重新創建相同的對象,因爲它似乎試圖訪問關係另一端的getter。

這會導致StackOverFlowException,因爲它永不停止(循環)。

您是否有任何想法我可以解決這個問題?

+0

所有我能說的是,Activator.CreateInstance不是一個好IOC容器! – Carsten 2012-03-05 09:47:44

回答

0

你可以使用memoization緩存你的viemodel後,它已被創建一次?

喜歡的東西:

public GroupVM Group 
{ 
    get 
    { 
     if(groupVM == null) 
     { 
      groupVM = Prisma.Web.Models.Factories.ViewModelFactory<Prisma.BO.Group>.ToViewModel<GroupVM>(this._Model.Group); 
     } 
     return groupVM; 
    } 
} 
+0

是的,但是後來我需要一個容器來容納已經創建的每個viewModels的引用。但的確,我可以做到這一點。 – Whoami 2012-03-05 10:07:50

+0

任何其他的想法,因爲如果我們使用這個,我們將需要進行大量的檢查,以知道何時創建新實例,因爲整個模型非常大。 – Whoami 2012-03-05 10:22:40

+0

爲什麼你需要使用視圖模型? – kjn 2012-03-05 10:59:47