当集合中的元素需要知道其他元素时,是否可以使用循环引用?

时间:2014-06-12 01:40:45

标签: c# wpf oop mvvm

假设我有一个类ApplicationState,它保存应用程序的状态,它具有Globs的集合。每个Glob必须具有唯一的名称,因此它应该以某种方式与ApplicationState相关,其中包含所有Globs的列表。我的想法是每个Glob应该能够进行自己的验证,因此我引入了GlobValidator,通过查看ApplicationState Globs列表来检查名称是否有效。所以现在我想知道ApplicationState了解Globs了解GlobValidator知道AplicationState的事实是否真的会让这个特征变得痛苦,应该改变。

public class GlobValidator
{
    private readonly IEnumerable<Glob> _globs;

    public GlobValidator(IEnumerable<Glob> globs )
    {
        _globs = globs;
    }

    public bool IsValidName(string name)
    {
        bool isThereGlobWithSameName = _globs.Any(g => g.Name == name);
        return !isThereGlobWithSameName;
    }
}

public class Glob
{
    private readonly GlobValidator _globValidator;
    private string _name;

    public Glob(string name, GlobValidator globValidator)
    {
        _globValidator = globValidator;
        Name = name;
    }

    public string Name
    {
        get { return _name; }
        set
        {
            if (_globValidator.IsValidName(value))
            {
                _name = value;
            }
        }
    }
}

public class GlobFactory
{
    private readonly GlobValidator _globValidator;

    public GlobFactory(GlobValidator globValidator)
    {
        _globValidator = globValidator;
    }

    public Glob CreateGlob(string name)
    {
        if (!_globValidator.IsValidName(name))
        {
            throw new Exception("Invalid Glob Name");
        }
        return new Glob(name, _globValidator);
    }
}

public class ApplicationState
{
    public ApplicationState()
    {
        Globs = new List<Glob>();
    }

    public List<Glob> Globs { get; set; } 
}

到目前为止,我遇到的烦恼是在从XML反序列化ApplicationState期间。作为例子

 ApplicationState
     Globs
     [0] Glob.Name = "John"
     [1] Glob.Name = "Jeff"

现在在我反序列化时给出了这样的状态我不能给Globs真正的GlobValidator,它引用了真实ApplicationState而没有从应用程序状态清除Globs,否则如果有GlobValidator将抛出在xml异常中具有相同名称的glob。我不想清除ApplicationState中的所有Globs,为xml错误的情况做准备,在这种情况下,我希望以前的ApplicationState不受影响。所以现在我在这种方法中的选择是创建一个GlobValidator的临时引用,它引用了一个临时的ApplicationState。这个价格是成功的XML序列化我将需要经历并重置每个GlobValidator上的Glob引用以引用真正的验证器,这对我来说听起来不是一个糟糕的权衡因为Globs有能力验证自己。

我试图让Glob能够验证自己是错误的吗?我是否应该使用Glob创建某种使用ApplicationState进行验证的包装器?或者这种方法听起来是否合理?

P.S。我正在使用WPF,因此Glob的工具INotifyPropertyChangedApplicationState列出了ObservableCollection的'Glob&#39>

0 个答案:

没有答案