Caliburn.Micro 和 Linq-to-SQL 如何协同工作

How does Caliburn.Micro and Linq-to-SQL work together

我正在使用 Caliburn.Micro,想知道是否有任何约定或惯例可以使用数据库和实体。我将所有数据库创建的东西放在我的 AppDataContext 中,它继承自 DataContext。然后我在 AppBootstrapper 中添加了一个 container.Singleton<AppDataContext>(); 并将 AppDataContext 注入到我的 ViewModel 构造函数中。

这很好用,但我不确定它是否正确?

另一个问题是当一个新实体被插入到我的 AddItemPage 的数据库中时如何更新我的 MainPage。当我导航回 MainPage 时,是否应该始终从数据库加载数据?或者我应该通过 IoC.Get<MainPageViewModel>(); 加载 MainViewModel 并在 AddItemViewModel 中手动插入实体?

我确定有很多选择,但我正在寻找预期的方式。

在 DI 容器中将 DataContext 注册为单例,然后通过构造函数注入在 ViewModel 中使用它似乎是一个不错的选择。

使用IoC.Get 不是一个好主意,它实际上是服务定位器反模式。另一个问题是,如果您使用 .PerRequest<> 注册您的 ViewModel(没有理由让它们成为单例),您的解决方案将不起作用,因为 IoC.Get 将 return 您的 ViewModel 的不同实例.

实现用例的正确方法是使用消息传递(在 Caliburn 中使用 IEventAggregator)。如果用户添加了一个新项目,您发送的消息将被您的 MainViewModel 捕获(不要忘记为消息注册)。然后您的 MainViewModel 可以重新加载所有数据,或者消息可能包含新记录的 Id,ViewModel 将只加载新记录并添加到 UI.

有关 Caliburn 消息传递的详细信息,请参阅 http://wp.qmatteoq.com/first-steps-with-caliburn-micro-in-windows-phone-8-messaging/