2013-10-08 2 views
2

저는 MVVM Light를 처음 사용하며 메신저 및 데이터 서비스 사용에 대해 궁금합니다.DataService를 사용한 성능

나는 dataService 클래스와 메서드 GetAll이 DBF 파일에서 데이터를로드하고있다. 모든 데이터는 DataGrid에 표시됩니다. 파일 경로는 OpenFileDialog에 의해 선택됩니다. 다른 견해로 갈 때 저는 그 데이터의 작은 평화 (한 열) 만 있으면됩니다. 이 방법에 의해 작은 개체를 보내는

  1. 초 뷰 모델에 파일 경로와 메신저 문자열 보내기 (전송 경로를 사용하여 파일을 다시 연결) 서비스로 데이터를 읽고 : 지금은 다른 뷰 모델이 데이터를 얻는 방법에 대해 궁금해 메신저하지만 앱이 다시 파일에 연결해야합니다.
  2. 첫 번째보기에서 DBF의 열 컬렉션을 준비하고 메신저로이 컬렉션을 보냅니다.

데이터를 여러 번 가져 오는 방법에 대해 궁금합니다. GetAll 메서드가 있으면 모든 데이터가있는 개체가 있습니다. 이 지금

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

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

    return _allData; 
    } 
} 

을? :처럼 뭔가를 할 수 나는 일부 데이터를 필요로 할 때 내가 수집 _allData을 사용할 수 있으며 할 DB를 연결하거나 때마다 파일을하지 않아도 다른 방법이 있다면.

그러나 일부 프로젝트에서는 모든 메소드가 DB에 연결되어있는 것을 보았습니다. 가장 좋은 방법은 무엇입니까?

(미안 내 질문에 혼란 경우)는, 데이터의 많은 수에서 검색 데이터베이스는 일반적으로 매우 빠른 검색을하기 때문에 빠른 수 있습니다 데이터베이스 쿼리를 사용하여 데이터를 필터링하는 경우

답변

0

).

또한 데이터를 RAM으로 한 번로드하면 데이터가 변경되면 DataGrid에 잘못된 데이터가 표시됩니다. 항목을 얻기 위해 데이터베이스에 이러한 기능의 각

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

연결하거나 연결 해제 :

모범 사례는 몇 가지의 DataService과 같은 기능을 쓸 수 있습니다. 그러나 분명히 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... 
    } 
} 

지금 당신은 쉽게 람다 표현식을 사용하여 상황에 맞는 데이터를 조회 할 수 있습니다 :

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

는 내가 큰 DB가 있다면 당신이 말한 것처럼 내가 방법을 사용한다는 것을 알고 그것을해야이 같은 일반적인 기능을 가지고 있습니다. 그러나 내 샘플에서는 DBF 파일 (약 1MB 미만)에 작은 DB가 있고 데이터 만 읽었으므로 RAM에서 데이터를 읽거나 저장할 때마다 성능에서 더 좋은 것이 무엇인지 모릅니다. . (리포지토리와 같은 패턴이 있습니까?) 또한 MVVM Messenger에서 객체를 보내는 데 대한 제한 사항에 대해 궁금합니다. 나는 가능한 한 작은 물건으로 보내거나 중요하지 않습니다. – pwroblew

+0

로드가 작기 때문에 RAM 옵션이 더 빠르게 작동한다고 생각합니다. 나는 내 대답을 편집했다. – Bijan

관련 문제