2

我是 MVVM Light 的新手,我想知道使用 Messenger 和数据服务。

我有一个 dataService 类和方法 GetAll 从 DBF 文件加载数据。所有数据都显示在 DataGrid 中。文件的路径由 OpenFileDialog 选择。当我转到另一个视图时,我只需要该数据的一小部分(一列)。现在我想知道如何在另一个视图模型中获取这些数据:

  1. 通过带有文件路径的 Messenger 字符串发送到第二个 viewModel 并通过服务读取数据(再次使用发送的路径连接到文件)这种方法通过 Messenger 发送较小的对象,但应用程序需要再次连接到文件或
  2. 在第一个 viewModel 上准备字符串集合(来自 DBF 的列)并通过 Messenger 发送这个集合。

我也想知道如何多次获取数据。如果我有 GetAll 方法,我有所有数据的对象。我可以有这样的东西吗?:

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

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

     return _allData;
   }
}

现在,如果我有另一种方法,我可以使用集合 _allData 并且每次需要一些数据时都不必连接数据库或文件。

但在一些项目中,我看到每种方法都与数据库有关。最佳做法是什么?

(对不起,如果我的问题很混乱;))

4

1 回答 1

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)放在一个循环中是一个错误。

为了简单起见,我建议使用较少耦合的方法,避免类之间的许多链接或使用静态属性。因为通常保留数据并避免连接到数据库不会显着提高性能。但是我不能确定,这取决于您的应用程序。


编辑:

如果您的 Db 文件非常小,您可以牺牲简单性来换取性能并将所有数据加载一次并将其存储在 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 表达式轻松查询 Context 数据:

var repository = new Repository<Product>(context);
List<string> nameColumn = repository.GetColumn(x => x.Name);
于 2013-10-08T21:43:53.720 回答