Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVP设计中,两个演示者如何在不使用单例模式或依赖项注入的情况下彼此交谈?_C#_Oop_Design Patterns_Mvp - Fatal编程技术网

C# 在MVP设计中,两个演示者如何在不使用单例模式或依赖项注入的情况下彼此交谈?

C# 在MVP设计中,两个演示者如何在不使用单例模式或依赖项注入的情况下彼此交谈?,c#,oop,design-patterns,mvp,C#,Oop,Design Patterns,Mvp,我试图通过学习新的编程方法,或者通过将两种模式结合使用,成为一个更“全面”的程序员,这是我以前从未做过的 我在许多项目中多次使用MVP或MVVP模式。每次我使用MVP时,它都会与单例设计或使用某种设计容器的DI设计相结合。在这两种情况下,我不必担心获得另一个Presenter特定实例,因为我可以使用DI轻松地通过我的CTOR获得它,或者通过按照“SomePresenter.instance”的思路将它从静态类型中删除 假设我想坚持使用MVP设计,我如何在不使用单例设计或DI的情况下访问其他演示者

我试图通过学习新的编程方法,或者通过将两种模式结合使用,成为一个更“全面”的程序员,这是我以前从未做过的

我在许多项目中多次使用MVP或MVVP模式。每次我使用MVP时,它都会与单例设计或使用某种设计容器的DI设计相结合。在这两种情况下,我不必担心获得另一个Presenter特定实例,因为我可以使用DI轻松地通过我的CTOR获得它,或者通过按照“SomePresenter.instance”的思路将它从静态类型中删除

假设我想坚持使用MVP设计,我如何在不使用单例设计或DI的情况下访问其他演示者?我唯一能想到的是使用某种事件系统,其中演示者有一组自定义事件,这些事件被加载到事件聚合器中。因此,如果我想使用事件聚合器在一个演示者上设置一个属性,我会用它的特定参数引发该特定事件,然后触发到另一个演示者中。这样,每个演示者仍然保持分离状态,这样系统就松散耦合了,但事情仍然可以正常通信

这只是我脑子里的想法,很可能不是理想的或最好的。我所寻找的是一种设计,在这种设计中,我可以解决我的根本问题“假设我想坚持MVP设计,我如何在不使用单例设计或DI的情况下访问其他演示者?”


我是用C语言编程的,所以C语言可能有一些工具使这成为可能,但只有在C语言中。我试图通过做我不习惯的事情来学习更多,希望在看到下面的一些设计模式和/或设计解决方案后,我可以通过拥有更多的解决方案来成为一名更好的编程人员。

有很多方法可以做到这一点。您没有提到您是将MVP用作Windows窗体还是Web窗体,因为它在许多方面都有所不同

在Windows窗体中,一种常见的方法是使用事件聚合器,正如您所提到的


我不确定您为什么不想使用依赖注入,因为它是一种非常可靠(没有双关语)的设计模式。我更愿意在几乎所有的情况下使用这个。如果你不想使用重型容器,你可以自己编写一个简单的容器。

我在这里不是要在设计模式方面挑明立场,但我注意到,在使用DI时,很容易获得循环引用,这样PresenterA通过DI将PresenterB的引用存储为变量,PresenterB到DI对PresenterA的引用存储为变量;据我所知,这使得垃圾收集或处理这些对象几乎是不可能的,这就是为什么我试图学习MVP(在WPF中)的新方法。我想使用一个导致松耦合的系统。我可能错了,如果我错了,请解释原因。谢谢@LandinMartens-你可以控制事情的运作方式。如果你有一个循环引用,不管你使用什么技术,你都会有一个循环引用。这不是DI或容器所特有的。如果您使用的是WPF,为什么要使用MVP而不是MVVM?不管怎样,微软的Prism WCF体系结构使用事件聚合来实现这一目的,但也使用DI。我发现,在有复杂项目的大型团队中,DI使循环引用更容易发生,但也有可能我从未见过这样做。不过,我会研究一下Prism arch/MVVM,谢谢。根据我的经验,事件聚合是最好的方法。