簡體   English   中英

WPF中的實體框架POCO類和ViewModel

[英]Entity Framework POCO classes and ViewModels in WPF

如何使用最有效的方法向WPF提供這些功能,而無需實現INotifyPropertyChanged和其他WPF東西來解決數百個POCO模型的問題?

現在,我將EntityFramework與簡單的POCO類和手工編寫的ViewModels結合使用。

我的架構如下所示:

  • 視圖
  • 視圖模型
  • 儲存庫模式
  • WCF存儲庫或數據庫存儲庫
  • 商業邏輯
  • 實體框架
  • POCO模型類

我的想法是:

  1. 使用AutomapperPOCO映射ViewModels類,然后再手動創建這些ViewModels。
  2. 使用T4生成基礎ViewModels作為POCO類之前生成的包裝,編寫​​我自己的(或使用現有的解決方案) Instance resolver類以在EF中提供相同的功能(一個實例=數據庫中的一條記錄)。

我很困惑,因為我不喜歡自己的解決方案,它現在還不穩定,但是Automapper在映射中使用了反射

該怎么辦? 您是否知道一些神奇的,真的很棒的工具來完成這些神奇的事情,並為我提供了添加和擴展ViewModel的靈活性?

我相信您假設:

  1. 通常您在ViewModel中創建Model對象的副本
  2. 通常,您在ViewModel的每個對象內實現INotifyPropertyChanged

我相信這兩個假設都是錯誤的。 看下面的代碼示例:

class Customer
{
  public int ID {get; set;}
  public string Name {get; set;}
}

class MyViewModel: INotifyPropertyChanged
{
  // Hook you repository (model) anyway you like (Singletons, Dependency Injection, etc)
  // For this sample I'm just crating a new one
  MyRepository repo = new MyRepository();

  public List<Customer> Customers 
  {
    get { return repo.Customers;}
  }

  public void ReadCustomers()
  {
    repo.ReadCustomers();
    InternalPropertyChanged("Customers");
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected void InternalPropertyChanged(string name)
  {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(name));
  }
}

class MyRepository
{
  private List<Customer> customers;
  public List<Customer> Customers
  {
    get { return customers; }
  }

  public void ReadCustomers()
  {
    // db is the Entity Framework Context
    // In the real word I would use a separate DAL object
    customers = db.Customers.ToList();
  }
}

客戶是實體框架返回的列表。 ViewModel屬性“客戶”是一個簡單的傳遞屬性,它指向Model屬性。

在此示例中,我不在Customer內部使用INotifyPropertyChanged。 我知道只有在用戶調用ReadCustomers()時才能修改客戶列表,因此在其中調用了PropertyChanged。

如果我需要為Customer類觸發PropertyChanged通知,則可以直接在Customer類上實現INotifyPropertyChanged。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM