MVC和观察者模式
我在项目中实现观察者模式方面存在问题. 该项目必须像Windows应用程序一样在C#中作为MVC进行. 在我的领域模型中,我有例如国家班级和国家存储库.我有一个国家控制者和观看所有国家(在表格上的列表),添加新国家和编辑现有国家的看法. 我不知道关于与不断变化的国家/地区有关的变化的看法.问题是我必须使用观察者模式.在网络上,我只能在一个受试者是国家和观察者是一个正在编辑一个国家的形式的形式,所有示例都在控制台应用程序中. 我需要我所有有国家都知道添加新国家的表格,而不仅仅是编辑现有国家.我应该怎么做,我应该把存储库做一个主题吗? 解决方案 您可以创建一个"管理"任务,该任务使您可以编辑/添加国家/地区. 此任务可能会有一个"乡村改变"的事件,其他观点可以订阅. 当您修改一个国家或创建新国家时,您会提出活动,订户可以对此做出反应. 您只需要确保您提出的事件使用一些自定义eventargs,以便您可以通过已修改为EventHandler的乡村对象. 您用什么来
观察者没有对不同线程上的阻塞性集合的改变做出反应
我有以下代码: class Program { static void Main(string[] args) { var watcher = new SNotifier(DumpToConsole); watcher.StartQueue(); Console.ReadLine(); } private static void DumpToConsole(IList> currentCol) { Console.WriteLine("buffer time elapsed, current collection contents is: {0} items.", currentCol.Count); Console.WriteLine("holder has: {0}", currentCol.Count); } }
4 2024-04-25
编程技术问答社区
在实现中使用数据库时,观察者模式和pub-sub是否相同?
我试图了解观察者模式并陷入特定点.在我的理解中,一旦观察者订阅以在任何事件更改上通知它们,则将订阅存储在某个地方,然后当事件更改时,通知了订户. . 在实际情况下,由于持久原因,我应该将值存储在数据库或文件中,并在事件发生后通过从DB获取并循环浏览列表. . 这是正确的理解吗?我没有看到任何涉及数据库的示例,但是,每个示例都使用列表. 又一次出版商/订户模式也相似,除了更改,没有确切了解出版商和订户是谁,而MQ或某种类型的中级技术则用于在两个之间建立通信. . 我的问题是:当我们在观察者模式中使用DB时,它不会成为发布者/订阅者(除了在这里了解观察者和发布者).这是正确的理解吗? 解决方案 在大多数观察者模式的示例中,您会看到使用列表,但是该列表的初始化如何取决于您的应用程序.例如,与您的情况一样,具有大量订户的应用程序必须出于持久原因存储这些订户.我们不能指望如此大量的订户一直在内存中.因此,观察者的列表仅是从DB中初始化的,尽管并非所有条目一次.
8 2024-04-24
编程技术问答社区
观察者模式或数据绑定
我的问题是,您是否实现观察者模式,或使用数据框来执行以下操作: 目前,我正在初始化GuidataOBJ的列表.触发事件时,我查找GuidataObjByID,然后修改对象,该对象是gueielement的数据.更新GUI. 有几个吉尔(目前都是相同类型的吉尔)反映的变化. public class GuiElement : ObservableImpl { private string guiElementName; public String GuiElementName { get { return guiElementName; } set { guiElementName = value; NotifyObservers(guiElementName); } } private string status;
8 2024-04-23
编程技术问答社区
正确的方法是合并从多个实例发射的事件的可观察序列
说我有一种工厂方法,可以耗尽T型的实例,并且我想要一个可观察到的序列,用于从我的所有实例中发射的事件,源自工厂方法. 正在使用Merge(),就像我在正确和最佳的方法下所做的那样? 我这样做的另一种方式是使用静态事件并使可观察到的顺序从中使用,但是我通常不喜欢使用静态事件,并且很好奇任何RX专家认为在这种情况下会是最佳选择吗? public T MakeFoo() where T: Foo, new() { this.instanceOfObservable.Merge(new T()); return self; } public class ObservableSequence : IObservable, IDisposable { private IObservable stream; public ObservableSequence() { } //
2 2024-04-23
编程技术问答社区
为什么我们要指定代表和事件,为什么不在C#中使用事件?
为什么我们与事件一起指定委托,为什么不在C#中使用事件? 例如,我有以下代码: class Shop { internal delegate void _EventHandler(object sender, GoodsInfoEventArgs e); internal event _EventHandler GoodsArrived; public void BringGoods(string goods) { if (GoodsArrived != null) { GoodsArrived(this, new GoodsInfoEventArgs(goods)); } } } 为什么开发C#的人不会以以下方式实施事件: class Shop { internal event _EventHandler GoodsArrived;
28 2024-04-22
编程技术问答社区
在C#中用代表实现的观察者模式?
已经回答了一个问题,它是 in C#,不是已经使用事件实现了观察者模式吗? 它询问观察者模式是否已经在使用事件的C#中实现. 当我获得事件和观察者模式时,观察者模式不是真的只是代表,事件是进一步的实现吗? 解决方案 您是正确的.事件只是一个功能略有不同的代表.所有观察者模式都可以与代表实现,而无需触摸event关键字. 您可能对"事件"关键字实际带到表中的内容感兴趣. 事件可以是接口的一部分,而 常规委托领域不能 事件不能由外部课程调用, 但是常规代表可以 事件还有其他访问者(添加和删除),您可以覆盖并为 提供自定义功能 编辑:这是一本很棒的文章,并在事件和委托之间进行IL代码比较. (提示:几乎相同).
26 2024-04-18
编程技术问答社区
C#代表与事件处理程序的关系
我想在发生陷阱时向任何订户发送警报消息. 我创建的代码使用委托方法myDelegate del. 我的问题是: 我想知道使用EventHandler而不是代表吗? 我不确定代表和EventHandler之间有什么区别. notify(trapinfo t),这就是我在这里为获取陷阱信息所做的.但这似乎不是一个好主意.我阅读了一些在线教程课程,介绍了通过代表对象.我想知道就我而言是否合适?我应该怎么做?有任何建议吗? 非常感谢:) 我的代码: public class trapinfo { public string info; public string ip; public string cause; } public class trap { public delegate void myDelegate(trapinfo t);
10 2024-04-17
编程技术问答社区
C#:事件或观察者接口?优点/缺点?
我有以下(简化): interface IFindFilesObserver { void OnFoundFile(FileInfo fileInfo); void OnFoundDirectory(DirectoryInfo directoryInfo); } class FindFiles { IFindFilesObserver _observer; // ... } ...我很矛盾.这基本上就是我在C ++中写的,但是C#有事件.我应该更改使用事件的代码,还是应该不理会? 事件比传统观察者界面的优点或缺点是什么? 解决方案 将事件视为接口只有一种方法的回调接口. 只需要挂钩事件 在活动中,您只需要为您有兴趣处理的事件实施处理程序即可.在"观察者接口"模式中,您必须在整个接口中实现所有方法,包括实现实际不关心处理的通知类型的方法.在您的示例中,即使您只关心这些事件之一,您始终必须实现onfoundDirectory
8 2024-04-14
编程技术问答社区
带有插件之间共享接口的C#插件架构
我将我的问题分为一个短而长的人,对于手头很少的人. 简短版本: 我需要一些带有提供商和消费者插件的系统的体系结构. 提供商应实施Intereface Iprovider,消费者应实施Iconsumer. 执行应用程序只能意识到Iprovider和Iconsumer. 消费者实施可以询问执行程序集(通过服务处理器),该程序提供者实现Interfacex并获取列表. 这些IPROVIDER对象应施放到Interfacex(在消费者中),以便能够将消费者连接到某些Events Interfacex定义.这将失败,因为执行程序集某种程度上不知道此Interfacex类型(铸件失败).解决方案是将互动界面包含在插件和执行程序集参考的某个组件中,但这应该意味着每个新的提供商/消费者对重新编译,并且是高度不可避免的. 有什么建议? 长版本: 我正在开发某种通用服务,该服务将使用插件来实现更高级别的可重复使用性.该服务包括使用提供商和消费者的某种观察者模式实现.提供者和消费
6 2024-04-12
编程技术问答社区
C#观察者/可观察者与委托的超级简单的例子
我最近开始研究C#,但我一生无法弄清楚在语言中实施观察者/可观察模式时的代表如何工作. 有人可以给我一个超简单的例子,说明它如何完成?我已经用谷歌搜索了这一点,但是我发现的所有示例都太过特定于问题,要么太"肿了". 解决方案 通常使用事件. 这是一个示例: using System; class Observable { public event EventHandler SomethingHappened; public void DoSomething() => SomethingHappened?.Invoke(this, EventArgs.Empty); } class Observer { public void HandleEvent(object sender, EventArgs args) { Console.WriteLine("Something happened to
18 2024-04-10
编程技术问答社区
C++11观察者模式(信号、槽、事件、改变广播者/听众,或任何你想叫它的东西)。
随着C ++ 11中所做的更改(例如std::bind的包含),是否有推荐的方法来实现一个简单的单线读取观察者模式,而无需依赖核心语言或标准库以外的任何内容(喜欢boost::signal)? 编辑 如果有人可以发布一些代码,显示如何使用新语言功能减少对boost::signal的依赖,那仍然非常有用. 解决方案 我认为bind使创建插槽变得更容易(cfr. doc/html/signals/tutorial.html#id3284837" rel =" noreferrer">'首选'语法与'Portable'语法 - 这一切都消失了).但是,观察者管理并没有变得不那么复杂. ,但为@r.马丁尼奥·费尔南德斯(Martinho Fernandes)提到:现在很容易地创建std::vector >,而没有(人造)"纯虚拟"界面类的麻烦. 应要求:有关连接管理的想法 - 可能充满了错误,但是您会得到这个想法:
16 2024-04-02
编程技术问答社区
如何从网络服务器异步下载图片
我的应用程序屏幕看起来类似于所附图像.我有多行,每行都有一个位图映像,标题和描述字段.所有信息都以XML的形式从我们的支持网络服务器中获取.现在,我使用了观察者设计模式,该模式创建了一个单独的线程,用于通过HTTP连接到我的远程服务器,下载并解析XML. XML包括每行的图像,标题和描述的URL. 到目前为止,我尝试了一些方法, 方法1: 创建了一个单独的方法(drawRow()),该方法通过指定布局来照顾将内容放在一起. ,然后使用方法下载图(),我尝试从drawRow()方法下载远程URL. 但是很烂,因为它使用相同的线程下载,并且UI被阻止. 方法2: 在搜索上述问题时,我遇到了 webbitmapfield href =" http://coderholic.com" rel =" nofollow noreferrer"> coderholic.com . ,然后,我正在使用我的drawRow()方法中的以下代码.据我了解,WebBitMa
6 2024-03-31
编程技术问答社区
当一个函数被执行时,jQuery/Javascript得到通知
var f = function() { // Do something useful here }; 有没有办法"观察"此功能,并在执行该功能时被通知?与 bind 相似的东西,但我想 bind 函数而不是dom事件? i 不想要这样的东西: var f = function() { // Do something useful here notifyObserver(); }; 但是我想要这样的东西: f.bind(function() { alert('F was executed.'); }); 解决方案 您可以用调用notifyObserver的函数替换f: f = (function(oldF){ return function(){ notifyObserver(); oldF(); }; })(f); 这样,您就不需要修改(旧的)
30 2024-03-30
编程技术问答社区
AVPlayer边界时间观察器偶尔无法发射
我正在使用avplayer的-addboundarytimeoserververimes:queue:using block:在视频中的特定时间执行某些代码(在这种情况下,我想要一个视频达到其持续时间时的un -hide a按钮.代码如下如下. : - (void)viewWillAppear:(BOOL)animated { ... _player = [AVPlayer playerWithURL:videoURL]; AVPlayerLayer *newPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:_player]; [newPlayerLayer setFrame:_videoView.bounds]; [_videoView.layer addSublayer:newPlayerLayer]; _observer = [_player addBoundaryTim
16 2024-03-21
编程技术问答社区
观察异步请求
我对API有三个单独的电话.当所有三个呼叫完成后,我将汇总数据并使用它来形成单独的模型对象. 我认为我会使用属性观察者来实现这一目标,但我不知道如何实现它.任何帮助或指导将不胜感激. 我创建了一个模型对象,以使网络调用将响应数据传递到逃脱的封闭中.这是解析数据的功能: func loadLibrary() { // League Data Containers var names = Dictionary() // API Call 1 var titles = Dictionary() // Call 1 var masteryLevels = Dictionary() // 2 var masteryPoints = Dictionary() // 2 // Champion Data Containers
10 2024-03-18
编程技术问答社区
回调/命令vs事件监听器/观察者模式
我正在尝试设计一个异步框架,并想知道人们认为回调模式的优点与观察者模式. Callback pattern: //example callback public interface Callback{ public void notify(MethodResult result); } //example method public class Worker{ public void doAsyncWork(Callback callback){ //do work callback.notify(result); } } //example observer pattern public interface EventListener{ public void notify(MethodResult result); } public class Worker{ private EventListener listener;
4 2024-03-18
编程技术问答社区
Google Tag Manager在观察 "dataLayer "阵列时使用的模式是什么?
我观察到dataLayer数组,我看不到push的任何更改.实际上根本没有自定义方法. GTM如何观察数组的变化?据我所知,更改Array不要扔任何事件,是吗? 编辑: 我做了更多的研究,发现了Google的库与dataLayer互动: https://github.com/google/data-layer-helper#listing-for-messages 我会看看代码,甚至可能会回答我自己的问题,如果我了解内部工作. 解决方案 GTM使用的模式是 Publish / subscriber 代码中的一些细节有助于识别它: https://github.com/google/data-layer-helper/blob/master/src/src/helper/helper/helper.js 最后一行114和119 // Add listener for future state changes. var oldPush = data
我应该使用监听器还是观察者?
我的GUI中有一个下拉框,其中显示了另一类阵列列表的内容. 可以将新对象添加到GUI其他位置的ArrayList,因此我需要知道何时更新它,以便我可以刷新下拉菜单.从我可以收集的内容来看,我的两个选择是扩展ArrayList类,以使我可以在其中添加我自己的ChangElistener,或者将包含所讨论的arraylist的类添加到该类中. . 哪个更合适的解决方案? 解决方案 这两种解决方案实质上是相同的根设计模式的实现("观察者"模式由四个帮派定义.后者您正在制作使用"可观察的数组"列表的域对象. 我的趋势是做后者:使域对象可观察到.这主要是因为您最终可能会有其他可能会改变域对象(应该更新GUI的事物.)如果已经可以观察到,您已经设置了. 请注意,您不必严格扩展java.util.Observable - 您可以在不这样做的情况下实现设计模式. 其他解决方案 很少使用Java中的Observable实现,并且与秋千的互操作互动不佳.改用EventLi
4 2024-03-04
编程技术问答社区
检测API响应中变化的最佳方法
嘿,所以我基本上有一个学校API,可以为我提供有关当前课程,家庭作业等的一些信息,因此它们取决于当前时间.我想围绕该API构建一个Android应用程序,该应用程序会在发生不同的课程或获得新作业或其他任何内容时向我发送通知. 那么,实现这一目标的最佳方法是什么?我想制作一个循环,该循环每x秒/分钟都会向API发送请求,如果它检索与我已经拥有的当前信息不同的信息,它会发送通知或其他任何信息.但是我不确定这是否是最佳方法. 我也听说过观察者模式,但我不确定它是否适用,因为我无法控制API级别的状态变化. 感谢您的回答,希望我清楚我要实现的目标,随时询问您是否想要更多信息. 解决方案 如果要在应用程序中实现查询,则将很难.我建议您构建一个不断查询API的服务器应用程序,并将推送通知(例如通过Firebase Cloud Messaging)发送给所有订阅到服务器应用程序的用户.
2 2024-03-02
编程技术问答社区