假设我有一个类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
的工具INotifyPropertyChanged
和ApplicationState
列出了ObservableCollection
的'Glob&#39>