2013-10-08 37 views
2

我是MVVM Light的新手,我想知道如何使用Messenger和數據服務。使用DataService的性能

我有一個dataService類和方法GetAll從DBF文件加載數據。所有數據都顯示在DataGrid中。文件路徑由OpenFileDialog選擇。當我轉到另一種觀點時,我只需要一點數據的和平(一列)。現在我不知道如何在另一個視圖模型得到這樣的數據:

  1. 通過Messenger的字符串的文件路徑發送到第二視圖模型和讀取服務數據(重新連接使用送到文件路徑)這種方法是通過發送小物件Messenger但應用程序需要再次連接到文件或
  2. 在第一個viewModel準備字符串集合(來自DBF的列)並通過Messenger發送此集合。

我也想知道如何獲取數據幾次。如果我有GetAll方法,我有所有數據的對象。我能有這樣的事情?:

class DataService : IDataService 
{ 
    List<T> _allData = new List<T>(); 

    List<T> getAll() 
    { 
    ... 
    _allData = ... 

    return _allData; 
    } 
} 

現在,如果我有另一種方法,我可以使用收集_allData而不必連接做的數據庫或文件,每次需要一些數據時。

但在某些項目中,我看到每種方法都與數據庫連接。最佳做法是什麼?

(對不起,如果我的問題是混亂的;))

回答

0

,如果你在一個大量數據的搜索,過濾用數據庫查詢,因爲數據庫通常會做的搜索相當快,可能會更快的數據。

此外,如果您將數據加載一次(進入RAM),當數據更改時,DataGrid將顯示無效數據。

最佳做法可能會寫一些DataService的功能,如:

List<ColumnType> GetColumn(int column) 
{ 
    var data = new List<ColumnType>(); 
    using (var connection = new MyConnection()) 
    { 
     //load data 
    } 
    return data; 
} 
在每個功能

連接和斷開到數據庫來獲取項目。但肯定把一個函數如GetSingle(ItemId)放在一個循環中是一個錯誤。

爲了簡單起見,我建議使用較少耦合的方法,避免類之間的許多鏈接或使用靜態屬性。因爲通常它不會使數據保持顯着的性能並避免連接到數據庫。但是我無法確定,這取決於您的應用程序。


編輯:

如果你的數據庫文件非常小,你可以犧牲簡單的性能和一次加載所有數據,並存儲在RAM中。你也可以使用這樣的標準庫:

public class Repository<TModel> where TModel: class 
{ 
    public Repository<TModel>(Context context) 
    { 
     _context = context; 
    } 
    private Context _context; 
    ... 
    public IEnumerable<TModel> Find(Expression<Func<TModel, bool>> where) 
    { 
     return _context.CreateObjectSet<TModel>().Where(where); 
    } 
    public IEnumerable<TResult> GetColumn(Func<TSource, TResult> selector) 
    { 
     return _context.CreateObjectSet<TModel>().Select(selector); 
    } 

} 

上下文是你把所有加載的數據。它應該有這樣一個泛型函數:

public class Context 
{ 
    private List<Customer> _customerList; 
    private List<Product> _productList; 
    public Context() 
    { 
     //Load All Lists here or in the following function instead 
    } 

    public List<TModel> CreateObjectSet<TModel>() where TModel : class 
    { 
     if (TModel is Customer) 
     { 
      //you can load _customerList here instead of in constructor 
      //check if _customerList is null then load it here for now and future use 
      return _customerList; 
     } 
     if (TModel is Product) 
     { 
      //check if _productList is null then load it here for now and future use 
      return _productList; 
     } 
     ... 
     throw... 
    } 
} 

現在你可以使用lambda表達式方便地查詢您的上下文數據:

var repository = new Repository<Product>(context); 
List<string> nameColumn = repository.GetColumn(x => x.Name); 
+0

我知道,如果我有巨大的數據庫就像你說的,我應該使用的方法。但在我的示例中,我有DBF文件中的小DB(大約<1MB),我只讀取數據,現在我不知道從RAM中讀取數據或每次從文件中讀取數據會更好(用於性能) 。 (有沒有像Repository這樣的模式?) 另外我想知道MVVM Messenger發送對象的限制。我儘可能發送小件物品,或者無所謂。 – pwroblew

+0

由於這是一個小的一次加載,我認爲RAM選項工作得更快。我編輯了我的答案。 – Bijan