2012-03-23 45 views
0

對於MVC3應用程序,我想創建一個可作爲服務訪問的可重用DAL,因爲這將在未來用於其他項目。如何使用EFCodeFirst爲MVC應用程序設置DAL RESTful服務?

I created all the entities TT模板和EFCodeFirst在一個單獨的項目中,然後在RESTful WCF服務中使用它。

這項服務的結構似乎從我寫的其他WCF服務,我已經指定REST風格的簽名,並作爲服務的接口方法的裝飾,即選配JSON響應有一點不同:

[WebGet(UriTemplate = "GetCollection")] 
    public List<SampleItem> GetCollection() 
    { 
     // TODO: Replace the current implementation to return a collection of SampleItem instances 
     return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } }; 
    } 

    [WebInvoke(UriTemplate = "", Method = "POST")] 
    public SampleItem Create(SampleItem instance) 
    { 
     // TODO: Add the new instance of SampleItem to the collection 
     throw new NotImplementedException(); 
    } 

凡本的RESTful WCF服務(從RESTful WCF選項創建)不同之處在於沒有接口,我可以用我需要的裝飾服務方法 - 沒關係。該服務將暴露諸如GetUserByID(int id)等方法。

問題是我想在MVC3應用程序中使用它,並且不清楚如何將模型連接到我的服務,並且想要一些方向在完成這一點。

謝謝。

回答

0

假設您想公開一個名爲Person的實體。 WCF REST服務可能如下所示:

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]  
public partial class PeopleWebService 
{ 
    [WebGet(UriTemplate = "")] 
    public List<Person> GetCollection() 
    { 
     try 
     { 
      IPeopleRepository repository = ServiceLocator.GetInstance<IPeopleRepository>(); 
      var people = repository.GetPeople(); 
      // use automapper to map entities to Person resource 
      var result = Mapper.Map<List<Person>>(people); 
      return result; 
     } 
     catch (Exception exception) 
     { 
      // do logging etc 
      throw new WebFaultException(HttpStatusCode.InternalError); 
     } 
    } 

    /* other methods */ 
} 

這些服務也可以由T4生成。

請注意,WCF服務本身不需要接口。我通常不直接在WCF服務中公開任何數據庫實體,因爲我的服務發展不同於我的數據庫實體。一旦API發佈,它應該幾乎保持不變。這可以防止我改變我的數據庫模式以適應新的需求。

相反,我將我的實體映射到資源。所以Person 5如下所示:

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string GivenName { get; set; } 

    /* more properties */ 
} 

這可能是使用T4來生成這些以及一件好事。路由定義是這樣的:

public void Register(RouteCollection routes) 
{ 
    routes.AddService<WorkspaceWebService>("api/v1/people"); 
} 

要從ASP.NET MVC項目中使用它,你可以分享如上定義組件的資源(又名人),或者你可以使用T4來生成一個獨立的一組資源幾乎相同,但具有ASP.NET MVC所需的一些附加屬性,如用於驗證的屬性。我會生成它,因爲我的ASP.NET MVC視圖模型通常獨立於我的REST資源發展。

讓我們假設您的REST服務運行在https://api.example.com/,您的MVC網站運行在https://www.example.com/。您的PeopleController可能如下所示。

public class PeopleController : ControllerBase 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(Get<List<Person>>(new Uri("https://api.example.com/api/v1/people"))); 
    } 

    protected T Get<T>(Uri uri) 
    { 
     var request = (HttpWebRequest) WebRequest.Create(uri); 
     request.Method = "GET"; 
     request.ContentType = "text/xml"; 
     using (var response = (HttpWebResponse) request.GetResponse()) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       Debug.Assert(responseStream != null, "responseStream != null"); 
       var serializer = new DataContractSerializer(typeof (T)); 
       return (T) serializer.ReadObject(responseStream); 
      } 
     } 
    } 
} 

從你的問題,我假設你想使用JSON。爲此,您只需在請求上設置適當的ContentType並使用DataContractJsonSerializer而不是DataContractSeralizer。請注意,日期和DataContractJsonSerializer存在一些問題。如果contenttype是「text/xml」,WCF rest服務將自動返回XML,如果是「application/json」,則WSS rest服務將自動返回JSON。

請注意,MVC應用程序不知道數據庫,數據庫實體或其數據庫上下文。事實上,MVC應用程序中沒有數據庫邏輯。您將必須密切關注安全性,因爲WCF休息服務中缺少用戶上下文。但是,這是一個完全不同的討論。

+0

這驗證了我上週發現的內容,因爲這可能不是最好的方法。在使用WCF RESTful模板時,您不得不爲數據序列化添加額外的代碼,即使它是純粹的.Net應用程序。我後來意識到,我從來不想直接從客戶端(以任何方式)訪問DAL。但是未來的項目可能需要這種靈活性序列化過程的很好解釋。謝謝。 – ElHaix 2012-03-26 15:08:59

+0

您可以使用WCF自動完成所有序列化等[在本例中列出](http://blogs.msdn.com/b/pedram/archive/2008/04/21/how-to-consume-rest-服務與 - wcf.aspx)。但是,您在客戶端上放鬆了很多功能,特別是在處理錯誤時。 – bloudraak 2012-03-26 18:18:37

0

想想這個的方法是,你的MVC應用程序現在只知道你的服務。它不知道背後有DAL。基本上,考慮服務你的「持久性」層。所以,現在你的MVC模型必須使用該服務來填充自己。因此,就像任何其他應用程序將填充服務一樣,這就是您的模型將如何填充自己。然後你的控制器將使用你的模型返回你的觀點。

這不是您可能需要的基本原理,但是如何在.NET中使用RESTful服務還有很多資源。檢查出來,並讓你的模型填充。然後讓你的模型進入你的視野。

+0

我剛剛重新閱讀您的文章,並意識到您錯過了您創建的服務的界面。這需要成爲你問題的關鍵。我的觀點仍然是,你需要關注你的問題的「填充我的模型」部分,而不是你問題的MVC部分。 – Quickhorn 2012-03-23 16:21:43

相關問題