Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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# 如何在Caliburn.Micro中编码/设计模型零件?_C#_Mvvm_Architecture_Caliburn.micro - Fatal编程技术网

C# 如何在Caliburn.Micro中编码/设计模型零件?

C# 如何在Caliburn.Micro中编码/设计模型零件?,c#,mvvm,architecture,caliburn.micro,C#,Mvvm,Architecture,Caliburn.micro,我不熟悉MVVM模式和Caliburn.Micro。我已经阅读了一些关于如何开始的教程,但是我对Caliburn上下文中MVVM的模型部分感到困惑 我想创建我的第一个MVVM应用程序,我有一些设计问题: 在教程中,模型在中作为简单属性显示 视图模型。我应该如何管理更复杂的模型?有吗 命名约定?显然,应该有一些外部类 为我的模型制作,但是我应该如何在我的模型之间进行沟通 风景怎么样 如何保持对一个复杂模型的多个实例的引用? 对于前客户(客户模型类的实例) 是否有可能在多个模型中操作一个模型类 视

我不熟悉MVVM模式和Caliburn.Micro。我已经阅读了一些关于如何开始的教程,但是我对Caliburn上下文中MVVM的
模型
部分感到困惑

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

  • 在教程中,模型在中作为简单属性显示 视图模型。我应该如何管理更复杂的模型?有吗 命名约定?显然,应该有一些外部类 为我的模型制作,但是我应该如何在我的模型之间进行沟通 风景怎么样
  • 如何保持对一个复杂模型的多个实例的引用? 对于前客户(客户模型类的实例)

  • 是否有可能在多个模型中操作一个模型类 视图模型?我应该如何存储我的模型引用 从不同的视图模型可见

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

提前感谢您的帮助:)

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

谢谢你的来信。我对这个话题理解得更清楚了,但我仍然对一些细节感到困惑

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

我的视图还有列表控件(无论什么),它将我的客户显示为原始字符串(比如“Name:John,姓氏:Doe,地址:…”我知道这样做很愚蠢,但我需要一个模型操作的示例(比如.toString())

在这个例子中,我创建了一系列东西来说明我对这个过程的看法:

  • 字段-它是一组表单字段,如名称、姓氏等
  • customerSet-它是一组Customer类,用于存储所有创建的 顾客
  • .addToDatabase(fields)-将新创建的客户 到数据库
  • .getStrings-一种方法,用于准备一组字符串以供使用 由CustomerView中的列表显示
我认为有两种方法适合解决方案:

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

  • 第二,类似MVC的方法。对我来说,这是最直观的。但是-我 不知道应该在哪里存储CustomerModel对象,太少了 ViewModels可以访问它

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

另一个问题是:我应该将从数据库加载所有客户的方法放在哪里,以便它们可以显示在列表上?在viewmodel内的“get方法”中,还是在模型类内

在教程中,模型在ViewModel中显示为简单属性。 我应该如何管理更复杂的模型?有名字吗 惯例?显然,应该有一些外部类为 我的模型,但是我应该如何在我的模型和 风景

您的模型应该表示他们需要的任何内容,无论是客户、帐户等。视图模型的工作是处理视图和模型之间的交互

如何保持对一个复杂模型的多个实例的引用? 对于前客户(客户模型类的实例)

通常,您会将复杂的模型映射到更友好的显示格式,您可以手动或使用AutoMapper之类的工具

是否有可能在多个模型中操作一个模型类 视图模型?我应该如何存储模型引用以使其可见 来自不同的视图模型

如果您使用的是本地数据库,则可以传递ID。如果它是一项服务,您可以在本地持久化模型,以供其他视图模型使用。您还可以向需要处理共享数据的视图模型中注入一个单例ISharedData

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

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

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

你的第一个方法是正确的。您认为共享模型是一个严重的问题,因为保存方法绑定到视图模型类。视图模型将有一个
SaveCustomerCommand
,由于其绑定,在单击按钮时会触发该命令

无论
CustomerModel
是如何持久化的,
SaveCustomerCommand
将持久化
CustomerModel
。因此,如果它是一个数据库,视图模型可能会引用一个上下文并发出一个
\u db.Save(CustomerModel)
。如果另一个视图模型需要操作
CustomerModel
,它将使用上下文进行操作。视图模型还可以引用处理
CustomerModel
的crud的
CustomerService

这可能是这样的:

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; }
} 
public类AddCustomerViewModel:屏幕
{
专用只读ICCustomerService(用户服务);
public addCustomerService模型(ICCustomerService customerService)
{
_customerService=customerService;
}
//如果按钮名为x:Name=“SaveCustomer”CM将
//按约定将其绑定到此方法
公共空间