gpt4 book ai didi

c# - 如何在 Caliburn.Micro 中编码/设计模型部分?

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:18 26 4
gpt4 key购买 nike

我是 MVVM 模式和 Caliburn.Micro 的新手。我已经阅读了一些关于如何入门的教程,但我对 Caliburn 上下文中 MVVM 的 Model 部分感到困惑。

我想创建我的第一个 MVVM 应用程序并且我有一些设计问题:

  • 在教程中,模型在 View 模型。我应该如何管理更复杂的模型?有没有命名约定?显然,应该有一些外部类为我的模型制作,但我应该如何在我的模型之间进行通信和风景?
  • 我应该如何保留对一个复杂模型的多个实例的引用?对于前。 cumtomers(客户模型类的实例)

  • 是否有可能在多个模型类中操作一个模型类查看模型?我应该如何存储我的模型引用,所以它会从不同的 ViewModel 可见?

  • 对于更复杂的模型操作/文件,我应该把我的代码放在哪里,数据库存储?我应该如何调用这样的代码?我不是在这里问关于 SQLConnections,但 MVVM 最佳实践。 :)

在此先感谢您的帮助:)

编辑:-------------------------------------------- ----------

谢谢你的回答。我更清楚地理解了这个主题,但我仍然对一些细节感到困惑。

举个例子,让我们假设这个小应用程序。我有一个允许我添加新客户的表格。它有几个字段,如姓名、姓氏等。按下按钮后,我在 ViewModel 中调用 addCustomer 命令。我希望我的程序将新创建的客户存储在数据库中。

我的 View 还有 List 控件(随便什么),它将我的客户显示为原始字符串(例如“姓名:John,姓氏:Doe,地址:...”我知道这样做很愚蠢,但我需要一个模型操作的例子(比如 .toString()))

对于这个例子,我创建了一堆东西来说明我对该过程的看法:

  • 字段 - 它是一组表单字段,例如姓名、姓氏等。
  • customerSet - 这是一组 Customer 类,用于存储所有创建的客户
  • .addToDatabase(fields) - 一种将新创建的客户放入数据库的方法到数据库
  • .getStrings - 一种准备一组字符串的方法在 CustomerView 中通过列表显示

我考虑了 2 种适合解决方案的方法:

  • 第一种方法。我不喜欢这个。唯一的好处是,ViewModel 处理应用程序内部的所有逻辑。共享模式在这里会是一个严重的问题,因为保存方法必然ViewModel 类。

First Approach

  • 其次,类似于 MVC 的方法。对我来说,这是最直观的。但是我不知道我应该在哪里存储 CustomersModel 对象,所以很少ViewModel 可以访问它。

Second aproach

哪个更好?或者另一种更适合 MVVM 的方法?

另一个问题是:我应该把从数据库中加载所有客户的方法放在哪里,这样他们才能显示在列表中?在 View 模型或模型类中的“get 方法”中?

最佳答案

In tutorials, the Model was presented as simple property in ViewModel. How should I manage more complex models? Is there any naming convention? Obviously, there should be some external classes made for my models, but how should I communicate between my models and the view?

您的模型应该代表他们需要的任何东西,无论是客户、帐户等。 View 模型的工作是处理 View 和模型之间的交互。

How should I keep references to many instances of one complex model? For ex. cumtomers (instances of Customer model class)

通常,您会将复杂的模型映射到更友好的格式以进行显示,您可以手动完成,也可以使用 AutoMapper 等工具。

Is there a possibility to manipulate one model class in many ViewModels? How should I store my model reference, so it'll be visible from different ViewModels?

如果您使用的是本地数据库,则可以传递 ID。如果它是一项服务,您可以在本地保留模型以供其他 View 模型使用。您还可以将单例 ISharedData 注入(inject)到需要使用共享数据的 View 模型中。

Where should I put my code for more complex model manupulation/file, database storage? How should I invoke such code? I'm not asking here about SQLConnections, but MVVM best practices. :)

为更复杂的模型操作/业务逻辑创建服务。将服务注入(inject)到需要它们的 View 模型中。 ICustomerService、IAccountService 等

编辑:-------------------------------------------- ----------

您的第一种方法是正确的。关于共享模型的观点是一个严重的问题,因为保存方法绑定(bind)到 View 模型类。 View 模型将有一个 SaveCustomerCommand,当按钮被点击时,由于它的绑定(bind),它被触发。

SaveCustomerCommand 将保留 CustomerModel,无论 CustomerModel 是如何保留的。因此,如果它是一个数据库,则 View 模型可能具有对上下文的引用并发出 _db.Save(CustomerModel)。如果另一个 View 模型需要操作一个 CustomerModel,它将通过使用上下文来实现。 View 模型还可以引用一个 CustomerService 来处理 CustomerModel 的 crud。

这可能是这样的:

public class AddCustomerViewModel : Screen
{
private readonly ICustomerService _customerService;

public AddCustomerViewModel(ICustomerService customerService)
{
_customerService = customerService;
}

//If button is named x:Name="SaveCustomer" CM will
//bind it by convention to this method
public void SaveCustomer(Customer customer)
{
_customerService.Save(customer);
}
}

public class CustomerListViewModel : Screen
{
private readonly ICustomerService _customerService;
private List<CustomerDisplayModel> _customers;

public CustomerListViewModel(ICustomerService customerService)
{
_customerService = customerService;
}

public List<CustomerDisplayModel> Customers
{
get { return _customers; }
set
{
_customers = value;
NotifyOfPropertyChange();
}
}

//only fires once, unlike OnActivate()
protected override void OnInitialize()
{
var customers = _customerService.LoadAllCustomers();

//could just use the model but this shows how one might map from
//the domain model to a display model, AutoMapper could be used for this
Customers = customers.Select(c => new CustomerDisplayModel(c)).ToList();
}
}

public interface ICustomerService
{
List<Customer> LoadAllCustomers();
void Save(Customer customer);
}

//same as button, Label named x:Name="CustomerName" will bind
// to CustomerName
public class CustomerDisplayModel
{
private readonly Customer _customer;

public CustomerDisplayModel(Customer customer)
{
_customer = customer;
}

public string CustomerName
{
get { return _customer.Name; }
set { _customer.Name = value; }
}

public string Surname
{
get { return _customer.Surname; }
set { _customer.Surname = value; }
}

public string Address
{
get { return _customer.Address; }
set { _customer.Address = value; }
}
}

public class Customer
{
public int Id { get; set; }

public string Name { get; set; }

public string Surname { get; set; }

public string Address { get; set; }
}

关于c# - 如何在 Caliburn.Micro 中编码/设计模型部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31032639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com