我认为这是一个相当简单的问题,但我仍然无法找到更好的解决方案。所以在研究了这个问题之后,我想在这里问这个问题以获得专家意见。
基本上,我正在研究 WPF 应用程序,并且我已经定义了GenericObserableCollection<T>
实现ObservableCollection<T>
,并且大多数集合都实现了它,以便在整个项目中采用标准方法。
[Serializable]
[CollectionDataContract]
public class GenericObservableCollection<T> : ObservableCollection<T>
{
public GenericObservableCollection() { }
public GenericObservableCollection(IEnumerable<T> collection)
: base(collection) { }
}
[Serializable]
[CollectionDataContract]
public class GenericRuleCollection : GenericObservableCollection<IRule>
{
public GenericRuleCollection() { }
public GenericRuleCollection(IEnumerable<IRule> collection)
: base(collection) { }
}
最初,一切都很好,但后来当实体框架出现时,我不得不彻底改变域设计,因为 EF 需要公开ICollection<T>
映射。那时,我很困惑保持最小的变化并适应 EF,因为我是新手。
后来经过研究,我遇到了一些处理这种情况的好文章。
我在我的应用程序域中应用了相同的方法来创建ChildrenStorage
作为ICollection<GenericRule>
EF 的要求。
现在我正在寻找一种聪明而优雅的方法来保持我的两个集合,即在添加和/或删除项目时ChildrenStorage
与集合同步。Children
由于Children
collection 将通过 UI 进行修改,因此我想跟踪对所做的任何更改Children
并希望同步ChildrenStorage
。
[Serializable]
[DataContract]
public abstract class GenericContainerRule : GenericRule
{
protected GenericContainerRule() : this(null)
{
ChildrenStorage = new List<GenericRule>();
}
protected GenericContainerRule(string name) : base(name)
{
ChildrenStorage = new List<GenericRule>();
}
public void AddChild(IRule rule)
{
ChildrenStorage.Add(rule as GenericRule);
_children = new GenericRuleCollection(ChildrenStorage);
OnPropertyChanged(nameof(Children));
}
public class OrMappings
{
public static Expression<Func<GenericContainerRule, ICollection<GenericRule>>> ChildrenAccessor = t => t.ChildrenStorage;
}
[DataMember]
protected ICollection<GenericRule> ChildrenStorage { get; set; }
private GenericRuleCollection _children;
public GenericRuleCollection Children => _children ?? (_children = new GenericRuleCollection(ChildrenStorage));
private GenericRuleCollection _children;
[DataMember]
public virtual GenericRuleCollection Children
{
get { return _children; }
private set { SetProperty(ref _children, value); }
}
}