有几种存储库 – 来自数据库(或其他)的按需加载,延迟加载的内存中集合,缓存的Web服务结果等.调用者无法区分.两个Rep< A>和Rep< B>恰好是内存中的集合,因为A和B不会发生很大的变化而且会长时间存在.
B的一个特性是A.我现在做的是,当要求B的A时,B得到IRep< A>.找到它的A并返回它.它每次都这样做 – 对B的A的每个请求都涉及IRep< A> .Find().好处是B从不持有A,每个请求都考虑到Rep的状态.缺点是很多IoC / IRep< A>搅动.
我正在考虑使用Lazy< T>这里模式使得B要求IRep< A>曾经坚持到底.但是如果A从其存储库中删除会发生什么?
我正在为Rep< A>寻找一种干净的方式.在变更时通知有兴趣的人.在我的例子中,某个B的A可能会被删除,所以我希望Rep< A>在删除或添加某些内容时引发事件等.Res< B>可能会订阅此事件来清理任何引用现在已经消失的A的B,等等.如何连接它?
理想情况下,在实例化Rep< A>时没有任何变化.它应该不知道谁在听,A可能会整天被操纵而不会激活一个Rep.
但是当Rep< B>天生就需要一种方式来订阅Rep< A>的事件.可能没有Rep< A>还活着,但肯定会有一个B被要求它的A,所以似乎可以启动一个Rep< A>.
在本质上,当Rep< B>实例化,它希望它用Rep< A>注册自己.用于事件通知.我不想污染IRep< T>界面因为这对于Repository层之外的任何人都无关紧要.其他类型的存储库可能根本不用担心这个问题.
这有意义吗?
解决方法
您可以按如下方式编写代码:
public class Observable<T>:Idisposable { private T instance; public T Instance { get{return instance;} set{ instance = value; var handlers = ReferenceChanged; if(handlers != null) handlers(this,instance); } public static implicit operator T(Observable<T> obs) { return obs.Instance; } //DO NOT attach anonymous delegates or lambdas to this event,or you'll cause a leak public event EventHandler<T> ReferenceChanged; public void dispose() { var handlers = ReferenceChanged; if(handlers != null) handlers(this,null); foreach(var handler in handlers) ReferenceChanged -= handler; } } public class Rep<T> { private Dictionary<T,Observable<T>> observableDictionary = new Dictionary<T,Observable<T>>(); ... public Observable<T> GetobservableFactory(Predicate<T> criteria) { //criteria should test only uniquely-identifying information if(observableDictionary.Keys.Any(criteria)) return observableDictionary[observableDictionary.Keys.First(criteria)]; else { //Todo: get object from source according to criteria and set to variable queryResult var observable = new Observable<T>{Instance = queryResult}; observableDictionary.Add(queryResult,observable); return observable; } } } ... var observableA = myRepA.Getobservable(myCriteria); observableA.ReferenceChanged += DoSomethingWhenReferenceChanges;
现在,如果更改了内部引用,或者处理了observable(它也处理了内部引用),将通知使用代码.为了使observable还通知消费代码,如果As的变化,A的子引用本身必须是可观察的,则触发由Observable< T>处理的事件.它将通过ReferenceChanged或更具体的处理程序(例如InstanceDataChanged)(或任何你想要调用它)来“冒泡”它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。