使用数据服务的性能
本文关键字:性能 服务 数据 | 更新日期: 2023-09-27 18:34:22
我是MVVM Light的新手,我想知道如何使用Messenger和数据服务。
我有一个数据服务类和方法 GetAll 从 DBF 文件加载数据。所有数据都显示在数据网格中。文件的路径由 OpenFileDialog 选择。当我转到另一个视图时,我只需要该数据的一个小和平(一列(。现在我想知道如何在另一个视图中获取这些数据模型:
- 通过具有文件路径的 Messenger 字符串发送到第二个视图模型并按服务读取数据(再次使用发送路径连接到文件(此方法通过 Messenger 发送较小的对象,但应用程序需要再次连接到文件或
- 在第一个视图模型准备字符串集合(来自 DBF 的列(并通过 Messenger 发送此集合。
我也想知道如何多次获取数据。如果我有 GetAll 方法,我有包含所有数据的对象。我可以有这样的东西吗?
class DataService : IDataService
{
List<T> _allData = new List<T>();
List<T> getAll()
{
...
_allData = ...
return _allData;
}
}
现在,如果我有其他方法,我可以使用收集_allData,并且不必每次需要一些数据时都连接数据库或文件。
但是在某些项目中,我看到每个方法都与数据库相连。最佳实践是什么?
(对不起,如果我的问题很混乱;)(
如果要搜索大量数据,使用数据库查询过滤数据可能会更快,因为数据库通常可以很快地执行搜索。
此外,如果将数据加载一次(到 RAM 中(,则当数据更改时,数据网格将显示无效数据。
最佳做法可能是编写多个数据服务函数,例如:
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 表达式轻松查询上下文数据:
var repository = new Repository<Product>(context);
List<string> nameColumn = repository.GetColumn(x => x.Name);