2012-08-01 29 views
5

Tôi có một số đối tượng POCO mà tôi đang sử dụng trong ngữ cảnh EF Code First. Vì vậy, khi tôi điền chúng với dữ liệu, tôi thực sự đang đối phó với các đối tượng proxy của EF thay vì bản thân các POCO.Cách tốt nhất để biến đối tượng proxy EF thành đối tượng POCO ban đầu là gì?

Tôi có một ASP.NET MVC4 ApiController trả về các đối tượng POCO của tôi, mà tôi sẽ tiêu thụ trong ứng dụng khách của tôi.

của tôi "GET" phương pháp trông giống như sau:

// GET api/Clients/5 
    public Client GetClient(int id) 
    { 
     Client client = db.Clients.Find(id); 
     if (client == null) 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound)); 
     } 

     return client; 
    } 

Điều đó không thực sự làm việc, bởi vì khi các serializer cố gắng sắp đặt từng đối tượng khách hàng, nó thực sự làm việc với phiên bản ủy quyền EF, gây nó để nấc cục. Xem Can an ApiController return an object with a collection of other objects?

Vì vậy, tôi có thể tắt hệ proxy bằng cách làm điều này để DbContext tôi:

db.Configuration.ProxyCreationEnabled = false; 

nào đảm bảo rằng tôi đang đối phó với các POCO chứ không phải là một proxy. Tuy nhiên, bây giờ hầu hết các thành viên trong lớp Khách hàng của tôi không có dân cư, vì đó là proxy của EF đang tải những thứ đó cho tôi.

Vì vậy, điều tôi thực sự muốn là sử dụng lớp proxy của EF để lấy dữ liệu, và sau đó vào phút cuối, hãy trả lại POCO ban đầu từ phương thức của tôi.

Làm cách nào tôi có thể làm điều đó mà không cần tạo thủ công toàn bộ đối tượng từ đầu (bao gồm bất kỳ đối tượng lồng nhau nào) trong mã? Chắc chắn phải có một cách dễ dàng - hoặc ít nhất là một lớp trợ giúp của một số loại?

Trả lời

3

Câu hỏi của bạn liên quan đến cách thiết kế kiến ​​trúc cho một ứng dụng. Về mặt kỹ thuật, có nhiều mô hình hơn trong một ứng dụng: Mô hình miền, Đối tượng truyền dữ liệu hoặc Xem mô hình cho các lớp khác nhau: Lớp logic nghiệp vụ, Lớp phân phối và Lớp trình bày.

Sử dụng sai mô hình trong ASP.NET MVC, tôi thường sử dụng mô hình miền (từ EF) làm mô hình xem vì trong một số trường hợp, mô hình miền là mô hình xem đủ cho giao diện người dùng của bạn. Nhưng thực tế nó hoàn toàn khác, với giao diện người dùng phức tạp, ví dụ: lưới, có thể cần nhiều mô hình miền để kết hợp trong một mô hình xem để cung cấp dữ liệu cho giao diện người dùng của bạn.

Tương tự với lớp phân phối, api web asp.net, người tiêu dùng có thể cần nhiều mô hình miền để làm điều gì đó. Nó thường không phải là mô hình miền 100% làm đối tượng chuyển dữ liệu. Vì vậy, để tách mối quan tâm, nó sẽ được gợi ý rằng bạn nên tạo và tách đối tượng DTO với đối tượng miền (đối tượng POCO từ EF), thậm chí nó được ánh xạ 1: 1 trong thuộc tính.

Ví dụ, nếu bạn có mô hình miền của Khách hàng, bạn cần phải có CustomerDto.

Bạn có thể ánh xạ theo cách thủ công hoặc sử dụng công cụ như AutoMapper, để ánh xạ mô hình miền của bạn tới mô hình DTO.

Bằng cách này, bạn cũng có thể tránh sự cố của mình.

+2

+1 lộ DTOs cho khách hàng từ xa là cách tốt nhất để đi. Nó cung cấp cho bạn toàn quyền kiểm soát dữ liệu được gửi qua dây. –

+0

Cảm ơn, tôi sẽ kiểm tra AutoMapper - có vẻ như chỉ là "lớp trợ giúp của một loại nào đó" mà tôi đang tìm kiếm. –

1

Tôi biết rằng bạn có câu trả lời, nhưng, có thể bạn sẽ muốn có một cái nhìn lúc này:

Các POCO loại proxy không thể được trực tiếp tuần tự hoặc deserialized bởi Windows Communication Foundation (WCF) , bởi vì công cụ tuần tự hóa DataContractSerializer chỉ có thể tuần tự hóa và loại bỏ các kiểu đã biết.Loại proxy không phải là loại đã biết. Để biết thêm thông tin, xem phần Serializing POCO Proxies trong chủ đề Working with POCO Entities. Để tuần tự hóa các proxy POCO thành các thực thể POCO, sử dụng lớp ProxyDataContractResolver để ánh xạ các kiểu proxy tới các kiểu POCO trong quá trình tuần tự hóa.

http://msdn.microsoft.com/en-us/library/vstudio/ee705457(v=vs.100).aspx

+0

Thú vị, cảm ơn. –

Các vấn đề liên quan