2015-06-01 27 views
1

我正在建立一個基於mfc的網站與ef6代碼第一類型數據庫。現在我有一個名爲Categories Controller的web api控制器,它可以很好地工作,並將json數據發送到我的js請求。多個實體與一個網絡api控制器

// GET: api/Categories 
    public IQueryable<Category> GetCategories() 
    { 
     return db.Categories; 
    } 

現在我需要爲產品,材料和一些其他實體連線。我喜歡的是: // GET:api/Data/Categories // GET:api/Data/Products

等全部連接到一個DataController中。有沒有辦法做到這一點?

例如,一個數據控制器,具有用於所有類別特定api操作的代碼區域,特定於產品的api操作等等。然後我可以做/ api/Data/Categories/Create或api/Data/Products /創建

+0

爲什麼你不能返回所有的人都在一個類或匿名對象延伸閱讀? – adt

+0

請參閱[通用WebApi控制器](http://stackoverflow.com/questions/12077361/generic-webapi-controller)。你介意每個實體類有一個控制器類嗎?如果你這樣做,你可以[實現你自己的'IHttpControllerSelector'](http://stackoverflow.com/questions/11886197/what-is-the-equivalent-of-defaultcontrollerfactory-in-asp-net-web-api)返回'新的GenericCRUDController'其中'T'根據請求的控制器解析,映射到一個實體類型。 – CodeCaster

回答

0

您可以通過創建一個包含兩者的新類來處理此問題,而不是引入新技術。 我假設他們之間沒有任何關係,比如產品有類別,但是您只需要兩個。

// GET: api/Data/ProductCategories 
public IQueryable<ProductsCategory> GetProductsCategories() 
{ 
    return GetProductsCategories(); 
} 

... 

public class ProductsCategory 
{ 
    public IEnumerable<Category> Categories { get; set;} 
    public IEnumerable<Product> Products{ get; set;} 
} 

... 
public ProductsCategory GetProductsCategories() 
{ 
    var products = db.Products.ToList(); 
    var categories = db.Categories.ToList(); 

    var productCategories = new ProductsCategory() 
    { 
     Products = products, 
     Categories = categories 
    }; 

    return productCategories; 
} 

或者其他類似的程度。

也不要直接返回IQueryable,除非該API的調用者會以某種方式執行一些查詢,而不是以某種方式執行一些查詢,而不是以某種方式執行一些查詢。而是返回一個列表IEnumerable

如果你正在尋找改善你有一點點的好,一定來包裝倉庫,你在某種服務的也有,所以你可以說沿着線的東西:

productsService.GetProductsCategories() 

而不是直接在您的API中訪問上下文。

爲庫層和服務層

https://codereview.stackexchange.com/questions/33109/repository-service-design-pattern

Difference between Repository and Service Layer?

+0

是否可以驗證多個實體?例如,如果我想更新一批實體,我需要檢查它們是否有效? – adiii4

0

最簡單的做法是實現OData控制器或Breeze控制器。他們將盡一切heavylifting到您的EF模型暴露在網絡API端點:

他們wuite易於安裝和OData的是這種公認的標準的任務。他們都已經預先支持過濾,過濾,分頁以及相關的處理等。有Nuget軟件包可以同時使用它們。

Breeze還具有功能豐富的客戶端JSC#,以及許多額外的功能。