我正在使用MVVM模式构建WPF应用程序,而Caliburn.Micro是促进开发的框架选择。
与传统的基于MVVM的应用程序不同,我在ViewModel(VM)层下添加了一个业务层(BL)来处理特定业务案例的逻辑。 VM留有数据绑定和简单的转换/表示逻辑。 BL下面是一个额外的数据访问层(DAL),它封装了使用Entity Framework
构建的数据模型(DM)。
我对WPF,MVVM都很陌生,当然,对Caliburn
几乎一无所知。我已经阅读了大量有关Caliburn
用法的问题和答案,现在尝试使用我目前在申请中学到的知识。
我的问题是:
EventAgreggator
(EA),WindowManager
或额外的安全性和验证服务),以及所有有关VM?这些应该通过构造函数注入VM实例(假设我将使用SimpleContainer)。因此,从任何经过适当设计和实例化的VM,我们都可以使用这些服务。如果我理解正确,Caliburn
及其IoC
维护一种全局状态,以便不同的VM可以使用和共享它。ShellViewModel
充当整个应用程序的主窗口,动态加载不同的VM(或屏幕)。每个VM都可以继承Screen
或ViewModelBase
或NotifyChangedBase
。当我进入时,让我们说VM A
,并希望切换到VM B
。我从VM A
内部发送消息(使用EA)到ShellViewModel
,说我想要更改为B. ShellViewModel
收到消息并重新加载{{1}属性。什么是适当的数据结构来维护要加载的VM列表? CurrentViewModel
或Conductor
之类的内容如何进入这个地方?WindowManger
以某种方式支持对数据库的访问(通过EF)。或者此访问权限应仅暴露给VM和/或BL?非常感谢!
答案 0 :(得分:1)
与传统的基于MVVM的应用程序不同,我在ViewModel(VM)层下面添加了一个业务层(BL)
这是标准情况。 ViewModel不能/不应该包含被认为是MVVM中的模型的一部分的业务逻辑(MVVM中的模型被认为是层,而不是对象或数据结构)。 ViewModel仅用于表示逻辑。
是的,Bootstrapper是您构建对象图的位置(配置IoC容器)。
注册ViewModel:取决于IoC框架。一些框架允许您解析未注册的类型,只要它们不是抽象或接口(即Unity)。不确定Caliburn,没有使用它。如果IoC支持它,则无需注册它们。
一种可行的方法。我更喜欢导航服务,更好地将参数传递给尚未实例化的视图和窗口,并且您始终知道只有一个对象处理它。
对于消息,可能有0个,1个或多个对象正在侦听它。由您决定