【发布时间】:2012-03-05 17:52:56
【问题描述】:
对于我们的项目,我们想使用 ViewModels。 所以我们决定为我们可以拥有的每个对象创建 ViewModel:
所以 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);
}
}
}
我们想使用一个工厂来为每个导航属性创建 ViewModel。
所以我们写了一个通用的 ViewModel 工厂如下:
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,因为它永远不会停止(循环)。
你们中有人知道我该如何解决这个问题吗?
【问题讨论】:
-
我只能说 Activator.CreateInstance 不是一个好的 IOC 容器!