2012-11-29 45 views
5

Từ những gì tôi đã đọc các lớp POCO nên kiên trì không biết gì và không nên chứa tham chiếu đến kho lưu trữ.POCO's, hành vi và Peristance Igorance

Q1. Với phần trên, tôi sẽ điền vào bộ sưu tập QuestionBlocks như thế nào? Tôi đã đọc rằng POCO nên có hành vi để bạn không kết thúc với một mô hình thiếu máu, vì vậy tôi là loại bối rối như thế nào một trong những nghĩa vụ phải làm điều đó mà không cần kiên trì. Nếu đó là trường hợp thì bạn sẽ đặt loại hành vi nào vào một POCO?

Ex:

public class Survey 
    { 
     public int SurveyId { get; set; } 
     public string Title { get; set; } 
     public int BrandId { get; set; } 
     public DateTime Created { get; set; } 
     public List<SurveyQuestionBlock> QuestionBlocks { get; set; } 

     [ResultColumn] 
     public string Name { get; set; } 


     /// <summary> 
     /// Constructor 
     /// </summary> 
     public Survey() 
     { 
      Created = DateTime.Now; 
      QuestionBlocks = new List<SurveyQuestionBlock>(); 
     } 
    } 

Trả lời

4

Với trên, làm thế nào tôi sẽ cư trú trong bộ sưu tập QuestionBlocks?

Khi đọc từ cơ sở dữ liệu, cơ sở hạ tầng kiên trì sẽ điền vào bộ sưu tập QuestionBlocks - reconstitution. Tái thiết không nên gọi hành vi, nó chỉ nên thiết lập các trường thích hợp trên POCO. Đây là trách nhiệm của kho lưu trữ. Kho lưu trữ thường được tham chiếu từ một dịch vụ ứng dụng, mà thiết lập giai đoạn để gọi hành vi thực thể.

Nếu trường hợp đó xảy ra thì bạn sẽ đặt loại hành vi nào vào POCO?

Hành vi trong thực thể POCO phải liên quan đến việc thay đổi thực thể cũng như duy trì bất biến - tức là đảm bảo tính toàn vẹn của thực thể. Trong ví dụ của bạn, loại hành vi đơn giản nhất trên POCO nên là phương pháp để thêm khối câu hỏi mới vào bộ sưu tập trên bản khảo sát. Lý tưởng nhất, bạn sẽ làm cho nhiều thuộc tính trên thực thể khảo sát chỉ đọc:

public class Survey 
    { 
     public int SurveyId { get; private set; } 
     public string Title { get; private set; } 
     public int BrandId { get; private set; } 
     public DateTime Created { get; private set; } 
     public IList<SurveyQuestionBlock> QuestionBlocks { get; private set; } 
     public string Name { get; private set; } 

     public void AddQuestionBlock(string questionBlockInfo) 
     { 
      this.QuestionBlocks.Add(new SurveyQuestionBlock(...)); 
     } 

     public Survey() 
     { 
      Created = DateTime.Now; 
      QuestionBlocks = new List<SurveyQuestionBlock>(); 
     } 
    } 

Lớp kiên trì sẽ có thể đặt giá trị của thuộc tính chỉ đọc qua phản xạ. Bạn có thể tiến thêm một bước và chỉ phơi bày khối câu hỏi dưới dạng bộ sưu tập chỉ đọc để đảm bảo rằng nó chỉ có thể được sửa đổi từ bên trong thực thể.

+0

Phát hiện, tất nhiên, POCO không nên tự điền chính nó –

+0

được giải thích rất rõ, cảm ơn bạn! – chobo

8

Tôi sẽ thêm một chế độ xem khác: POCO nêu rõ các đối tượng không phụ thuộc vào bất kỳ khung công tác nào. Định nghĩa wiki của một POJO là nhiều hơn nữa có ý nghĩa với tôi thì một cho POCO:

Để diễn giải định nghĩa wiki của POJO, chúng ta có thể nói rằng đối tượng POCO có thể không bị buộc để:

I. Mở rộng lớp được xác định trước:

public class MyClass : AnyFramework.ObjectBase {... 

II. Thực hiện các giao diện được xác định trước

public class MyClass : AnyFramework.IHaveDependency {... 

III.Chứa xác định trước thuộc tính

[AnyFramework.KeyAttribute] 
public class MyClass {... 

Với (hầu hết mọi thứ khác được phép) này trong ý nghĩa của việc chăm sóc về tình trạng đối tượng. Các từ khác, nếu đối tượng sẽ kiểm tra logic nghiệp vụ, đúng là.

Nhưng bất kỳ đối tượng POCO nào đều có thể được sử dụng trong một khuôn khổ. Ngày nay, nó chủ yếu dành cho ORM chịu trách nhiệm cho sự kiên trì. Tất cả các tầng ứng dụng đang làm việc với các đối tượng POCO, trong khi lớp dữ liệu chịu trách nhiệm tải và lưu trữ (CRUD). Điều này chủ yếu được thực hiện thông qua Proxy của các đối tượng POCO này.

Vì vậy, POCO có thể được sử dụng làm đối tượng kinh doanh đầy đủ, có thể tự chăm sóc (kiểm tra tính chính xác của các mục thu thập, thuộc tính ...). Điều này làm cho nó khác với DTO

+1

+1 để nêu rõ sự khác biệt giữa POCO và DTO. Có vẻ như rất nhiều người quá lười biếng để nhìn vào các định nghĩa và vui vẻ sử dụng một thuật ngữ cho những ngày khác. – guillaume31