Tag: observer pattern

用事件实现观察者模式

我正在开发一个Silverlight应用程序,我过度使用了观察者模式。 在我的实现中,我创建了两个接口IObservable和IObserver 。 前者包含将观察者附加到观察者的方法。 后者有一个方法Notify(IObservable observable, …) ,当observable改变了它的状态时,observable通过observer.Notify(this, …)传递自身作为参数。 现在我偶然发现了“事件”,对我而言,似乎这就是观察者模式的实现,只是代表而不是前面提到的Notify -method。 是对的吗? 我不太了解代表,也不想花几个小时重写我的代码只是为了最终得到与现有代码完全相同的代码。 另一方面,事件可能优于基于接口的观察者模式。 我错过了什么吗?

正确合并从多个实例触发的事件的可观察序列的方法

假设我有一个工厂方法,可以生成类型为T的实例,并且我想要一个Rx可观察序列,用于从我的所有实例中触发的事件源自工厂方法。 正如我在下面所做的那样使用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() { } // this method is called in the factory method for each new instance of T public void Merge(Foo instance) { if (this.stream == null) { […]

C#插件架构,接口在插件之间共享

我把我的问题分成了一个简短的长版本,适合那些没有时间的人。 精简版: 我需要一些带有提供者和消费者插件的系统架构。 提供商应实施interface IProvider,消费者应实施IConsumer。 执行的应用程序应该只知道IProvider和IConsumer。 消费者实现可以向执行程序集(通过ServiceProcessor)询问哪些提供程序实现InterfaceX并获取List。 这些IProvider对象应该被转换为InterfaceX(在使用者中),以便能够将使用者挂钩到InterfaceX定义的某些事件上。 这将失败,因为执行程序集以某种方式不知道此InterfaceX类型(强制转换失败)。 解决方案是将InterfaceX包含在插件和执行程序集引用的某个程序集中,但这应该意味着对每个新的提供者/消费者对进行重新编译并且非常不受欢迎。 有什么建议? 长版: 我正在开发某种通用服务,它将使用插件来实现更高级别的可重用性。 该服务包含使用提供者和使用者的某种Observer模式实现。 提供者和使用者都应该是主应用程序的插件。 让我首先通过列出我在解决方案中的项目来解释服务是如何工作的。 项目A:用于托管所有插件和基本function的Windows服务项目。 TestGUI Windows窗体项目用于更轻松的调试。 来自Project B的ServiceProcessor类的一个实例正在执行与插件相关的东西。 此项目的子文件夹“Consumers”和“Providers”包含子文件夹,其中每个子文件夹分别包含一个使用者或提供者插件。 项目B:包含ServiceProcessor类的类库(在插件之间执行所有插件加载和调度等),IConsumer和IProvider。 项目C:链接到项目B的类库,由TestConsumer(实现IConsumer)和TestProvider(实现IProvider)组成。 TestProvider实现了一个额外的接口(ITest,它本身派生自IProvider)。 这里的目标是Consumer插件可以向ServiceProcessor询问它所拥有的提供者(至少实现IProvider)。 返回的IProvider对象应该被转换为它在IConsumer实现中实现的其他接口(ITest),以便使用者可以将事件处理程序挂钩到ITest事件。 项目A启动时,将加载包含使用者和提供者插件的子文件夹。 以下是我到目前为止遇到的一些问题并试图解决。 ITest过去常常驻留在Project C中,因为这仅适用于TestProvider和TestConsumer所知道的方法和事件。 一般的想法是保持项目A简单并且不知道插件彼此做什么。 使用项目C中的ITest和TestConsumer的Initialize方法中的代码将IProvider转换为ITest(当实现ITest的对象被称为IConsumer对象时,这不会在单个类库中失败)会发生无效的转换错误。 通过将ITest接口放入项目A引用的项目B中,可以解决此错误。 这是非常不受欢迎的,因为我们需要在构建新接口时重新编译项目A. 我试图将ITest放在由项目C引用的单个类库中,因为只有提供者和使用者需要知道这个接口,但没有成功:当加载插件时,CLR声明无法找到引用的项目。 这可以通过挂钩当前AppDomain的AssemblyResolve事件来解决,但不知何故这似乎也是不需要的。 ITest再次回到了B项目。 我尝试将项目C拆分为消费者和提供者的单独项目,并且都加载本身运行良好的程序集:两个程序集都驻留在Assemblies集合中或当前的AppDomain:Assembly found:Datamex.Projects.Polaris.Testing.Providers ,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 2813de212e2efcd3发现大会:Datamex.Projects.Polaris.Testing.Consumers,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = ea5901de8cdcb258 由于消费者使用提供者,因此从消费者到提供者进行了引用。 现在AssemblyResolve事件再次触发,表明它需要以下文件:AssemblyName […]