2013-03-17 1 views
0

"oData"형식으로 업그레이드해야하는 기존 서버 프레임 워크 (WCF 서비스)가 있습니다. http://www.odata.org/ecosystemoData 사용자 지정 공급자

내가 내 코드를 많이 재 작성이 필요하기 때문 "엔티티 프레임 워크"를 사용하지 않도록하려면, 그래서 "사용자 지정 공급자"솔루션을 정착 : 는 나는 "중 하나로, OData"사이트에서 약간의 하나로, OData 샘플을 다운로드했습니다. 내가보기에 모든 예제에서 나를 괴롭힌다.

호출 할 때마다 전체 데이터 모델을 처음부터 초기화하는 CreateDataSource() 메소드 (코드가 첨부 됨)가 호출된다. 이 데모 버전에서는 비즈니스 엔티티 인스턴스 6 개를 다시로드 한 다음 실제 인스턴스에서 필터링하는 것은 큰 일이 아닙니다. 테이블을 정리하고 각각 1000-1000000 개의 행을 포함 할 것입니다.

매번 전체 DB를 메모리에로드하지 않는 방법은 무엇입니까 ?? 나는 아마 뭔가를 놓친 것입니다, 그렇지 않으면이 기술은 유용하지 않았을 것입니다.

protected override DSPContext CreateDataSource() 
    { 
     DSPContext context = new DSPContext(); 

     ResourceSet productsSet, categoriesSet; 
     this.Metadata.TryResolveResourceSet("Products", out productsSet); 
     this.Metadata.TryResolveResourceSet("Categories", out categoriesSet); 
     IList<DSPResource> products = context.GetResourceSetEntities(productsSet.Name); 
     IList<DSPResource> categories = context.GetResourceSetEntities(categoriesSet.Name); 

     var categoryFood = new DSPResource(categoriesSet.ResourceType); 
     categoryFood.SetValue("ID", 0); 
     categoryFood.SetValue("Name", "Food"); 
     categoryFood.SetValue("Products", new List<DSPResource>()); 
     categories.Add(categoryFood); 

     var categoryBeverages = new DSPResource(categoriesSet.ResourceType); 
     categoryBeverages.SetValue("ID", 1); 
     categoryBeverages.SetValue("Name", "Beverages"); 
     categoryBeverages.SetValue("Products", new List<DSPResource>()); 
     categories.Add(categoryBeverages); 

     var categoryElectronics = new DSPResource(categoriesSet.ResourceType); 
     categoryElectronics.SetValue("ID", 2); 
     categoryElectronics.SetValue("Name", "Electronics"); 
     categoryElectronics.SetValue("Products", new List<DSPResource>()); 
     categories.Add(categoryElectronics); 

     var productBread = new DSPResource(productsSet.ResourceType); 
     productBread.SetValue("ID", 0); 
     productBread.SetValue("Name", "Bread"); 
     productBread.SetValue("Description", "Whole grain bread"); 
     productBread.SetValue("ReleaseDate", new DateTime(1992, 1, 1)); 
     productBread.SetValue("DiscontinueDate", null); 
     productBread.SetValue("Rating", 4); 
     productBread.SetValue("Category", categoryFood); 
     productBread.SetValue("BackupCategoryID", 2); 
     productBread.SetValue("RelatedProductID", 1); 
     products.Add(productBread); 

     var productMilk = new DSPResource(productsSet.ResourceType); 
     productMilk.SetValue("ID", 1); 
     productMilk.SetValue("Name", "Milk"); 
     productMilk.SetValue("Description", "Low fat milk"); 
     productMilk.SetValue("ReleaseDate", new DateTime(1995, 10, 21)); 
     productMilk.SetValue("DiscontinueDate", null); 
     productMilk.SetValue("Rating", 3); 
     productMilk.SetValue("Category", categoryBeverages); 
     productMilk.SetValue("BackupCategoryID", 2); 
     productMilk.SetValue("RelatedProductID", 2); 
     products.Add(productMilk); 

     var productWine = new DSPResource(productsSet.ResourceType); 
     productWine.SetValue("ID", 2); 
     productWine.SetValue("Name", "Wine"); 
     productWine.SetValue("Description", "Red wine, year 2003"); 
     productWine.SetValue("ReleaseDate", new DateTime(2003, 11, 24)); 
     productWine.SetValue("DiscontinueDate", new DateTime(2008, 3, 1)); 
     productWine.SetValue("Rating", 5); 
     productWine.SetValue("Category", categoryBeverages); 
     productWine.SetValue("BackupCategoryID", 4); 
     productWine.SetValue("RelatedProductID", 3); 
     products.Add(productWine); 

     ((List<DSPResource>)categoryFood.GetValue("Products")).Add(productBread); 
     ((List<DSPResource>)categoryBeverages.GetValue("Products")).Add(productMilk); 
     ((List<DSPResource>)categoryBeverages.GetValue("Products")).Add(productWine); 

     return context; 

답변

0

이들은 단지 샘플입니다. 실제 솔루션은 데이터를 일부 "상점"에 저장하고 해당 상점에 IQueryable을 구현합니다. 이 구현은 일반적으로 많은 코드이며 샘플 의도와 직접 관련이 없기 때문에 샘플에 포함되지 않았습니다.

그래서 귀하의 질문에 대답하기 :

  • 당신은 당신이 사용하는 저장 통해 된 IQueryable 구현이 필요합니다. 이것이 DB 인 경우 데이터베이스를 CLR 공간에 매핑하려면 일부 ORM (예 : EF)이 필요합니다. ORM은 대개 IQueryable 구현도 제공합니다. EF 외에도 Hibernate 또는 LINQ to SQL이 있습니다.

  • 당신은 샘플과 같이 (등등 IDataServiceMetadataProvider, IDataServiceQueryProvider와 같은 인터페이스를 구현)을 지정 공급자 코드를 작성하고, (샘플의 된 IQueryable 구현을 Object로 LINQ를 사용)를 GetQueryRootForResourceSet에서 상점 된 IQueryable를 반환해야합니다.

맞춤형 제공 업체는 많은 작업이 있습니다. SQL에 대한 Hibernate 나 LINQ와 같은 ORM을 사용할 수 있다면, 대신 리플렉션 프로 바이더를 사용하는 것이 훨씬 빠르며 여전히 작동 할 것입니다.

+0

사용자 지정 공급자의 샘플 코드에 대해 알고 계십니까? – user355289

+0

http://www.odata.org/ecosystem#samplecode - OData Provider Toolkit을 찾으려면 사용자 정의 공급자의 샘플이 포함되어 있어야합니다. 그러나 IQueryable 샘플을 포함하는 것은 아니며 LINQ to Objects를 사용합니다. –