ViewModel有很多很多关系

时间:2012-03-05 09:43:46

标签: c# generics viewmodel

对于我们的项目,我们想使用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,因为它永远不会停止(循环)。

你们有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在创建一次viewmodel之后,你能使用memoization来缓存它吗?

类似的东西:

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