C# mvvm?mvvmc?还是我做错了?

C# mvvm?mvvmc?还是我做错了?,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我目前正在构建一个wpf应用程序,其中视图模型调用singleton logics类中的函数,以便获取其模型或修改现有模型。。。logics类负责创建模型并将相关更改通知视图模型。现在我的问题是我做得对吗,还是有更好的方法?因为似乎没有其他人是这样做的-我是wpf的新手,我不想一开始就错了 我的应用程序从数据库中获取某些对象并将其显示在图形上,有一个视图模型负责显示数据,其余视图模型接收用户输入以修改数据。您已经遇到了MVVM问题#1-有许多不同的方法,MVVM是一种模式,而不是框架 细节:vi

我目前正在构建一个wpf应用程序,其中视图模型调用singleton logics类中的函数,以便获取其模型或修改现有模型。。。logics类负责创建模型并将相关更改通知视图模型。现在我的问题是我做得对吗,还是有更好的方法?因为似乎没有其他人是这样做的-我是wpf的新手,我不想一开始就错了


我的应用程序从数据库中获取某些对象并将其显示在图形上,有一个视图模型负责显示数据,其余视图模型接收用户输入以修改数据。

您已经遇到了MVVM问题#1-有许多不同的方法,MVVM是一种模式,而不是框架

细节:viewmodel是一个执行自己的更改通知(使用INotifyPropertyChanged)的模型,这是它的核心任务之一。我会将更改通知排除在业务逻辑之外,这是一个依赖于视图的问题,并且没有任何功能


关于单例,我只能建议您在不使用单例实现的情况下开发类,并使用依赖项注入容器(如Ninject)将它们解析为单例。否则,您将得到大量难以测试的代码(以及大量冗余)。静态的东西是可以测试的,但是当涉及到嘲弄时,它们会变得非常糟糕。

我对目前为止给你的一些观点有不同的看法。在我个人看来,每个视图应该有一个视图模型。平心而论,我的观点所依据的只是它的工作情况。在我看来,利用MVVM模式的美妙之处在于它的简单性。。。只需将所有数据属性和功能放入其相关视图所需的每个视图模型中

我不同意@SebastianEdelmeier关于使用依赖注入而不是单例类的评论。依赖注入实际上只是通过构造函数将接口数据传递给类。虽然我不反对依赖项注入,但应该注意的是,即使是MSDN依赖项注入页面也被标记为
退役内容

我有许多
…Manager
类(其他人可能称之为服务类),它们都是单例类。。。它们必须是这样的,这样我才能确保每一个都只有一个实例。它们在单元测试中绝对没有问题,因为它们都是接口的,我提供了
…MockManger

然而,我接受@SebastianEdelmeier的观点,即实际的
…Manager
类中的代码更难测试,但它主要只是将文件保存到硬盘或发送电子邮件的基本代码。这种代码已经被微软彻底测试过,甚至不需要(单元)测试。即便如此,也有可能对它们进行测试

然而,这些服务类都做了一些独特的事情,需要引用视图模型无法访问的特定DLL或资源。。。因此,它们为视图模型提供了视图模型自己无法提供的一些服务。这听起来有点像您已经将功能放入了您的单例类中,该类可能(也可能应该)位于您的视图模型中。我建议不要这种做法

设想一下为视图提供一切的视图模型。。。数据、功能、对服务功能的访问等。使用服务类的唯一原因是为视图模型提供一些视图模型本身无法提供的服务。如果功能不属于这一类,并且您的视图模型可以自己提供,那么它应该属于这一类

在我看来,其中一个主要的例外是,如果您有某种类型的
Repository
类遵循Repository模式。。。视图模型可以创建新的类实例,但使用存储库模式可以减少代码重复。。。这可能就是你的单身学生课程的目的,在这种情况下,这很好



你会看到有人投票结束了你的问题。这是因为你发布了一个相当主观的问题,可能有许多不同的答案,但没有一个正确的答案。你可能会发现你的问题因为这个原因被关闭甚至删除。虽然我理解你提出这样一个问题的原因,但你真的应该在将来尽量避免这些类型的问题。

不要太担心这种模式。你所描述的听起来是对的。使用虚拟机主要控制UI,使用模型作为域逻辑,并使用您的判断来保持简单并完成工作。您所说的视图模型负责自己的更改通知是什么意思,我使用的是inotifypropertychanged,但是,当用户决定限制其他viewmodel上图形显示的数据时,我使用逻辑调用相关事件。我将查看ninject“作为主要基于意见的搁置”-
answer.parations.First().Split(“”).Count(a=>a.Contains(“意见”)//返回4
:)我认为逻辑名称有误导性,它更像是一个控制所有与模型的通信的类,有点像一个控制器,但不完全是,无论如何,我想我现在知道我想怎么做了。。