2009-02-14 36 views
12

Tôi đang cố gắng xác định cách tốt nhất để kiến ​​trúc một dự án .NET Entity Framework để đạt được một cách tiếp cận lớp đẹp mắt. Cho đến nay tôi đã thử nó trong một trò chơi dựa trên trình duyệt, nơi người chơi sở hữu và vận hành các hành tinh. Đây là cách tôi đã có nó:Bố cục khung thực thể .NET Entity (kiến trúc)

trang web

này chứa tất cả kết thúc trước.

C# Dự án - MLS.Game.Data

này chứa các tập tin EDMX với tất cả các ánh xạ dữ liệu của tôi. Không có gì khác ở đây.

# Dự án C - MLS.Game.Business

này chứa các lớp khác nhau mà tôi gọi như PlanetManager.cs 'quản lý'. Người quản lý hành tinh có nhiều phương pháp tĩnh khác nhau được sử dụng để tương tác với hành tinh, chẳng hạn như getPlanet (int planetID) sẽ trả về một đối tượng mã được tạo từ MLS.Game.Data.

Từ trang web, tôi sẽ làm một cái gì đó như thế này:

var planet = PlanetManager.getPlanet(1);

Nó trả về một Planet đối tượng từ từ MLS.Game.Data (tạo ra từ các EDMX). Nó hoạt động, nhưng nó làm phiền tôi đến một mức độ bởi vì nó có nghĩa là kết thúc trước của tôi phải tham khảo MLS.Game.Data. Tôi luôn cảm thấy rằng GUI chỉ cần tham khảo dự án kinh doanh.

Ngoài ra, tôi thấy rằng các lớp Trình quản lý của tôi có xu hướng rất nặng. Tôi sẽ kết thúc với hàng tá phương pháp tĩnh trong chúng.

Vì vậy, ... câu hỏi của tôi là - làm cách nào để mọi người khác đưa ra các dự án ASP EF của họ?

EDIT

Sau khi một số mặc dù nhiều, có mục bổ sung mà làm phiền tôi. Ví dụ, giả sử tôi có đối tượng Planet của tôi, một lần nữa được tạo ra từ trình thủ thuật. Điều gì sẽ xảy ra nếu một thời gian mà Planet của tôi cần có một tài sản đặc biệt, nói "Dân số" là một phép tính của một số loại dựa trên các đặc tính khác của đối tượng Planet. Tôi có muốn tạo ra một lớp mới kế thừa từ Planet và sau đó quay trở lại mà thay vào đó? (Hmm, tôi tự hỏi nếu những lớp học được đóng dấu của EF?)

Cảm ơn

+0

trả lời chỉnh sửa của bạn - đó là nơi tách dữ liệu và các đối tượng đa dạng. các đối tượng phong phú hiểu cách phơi bày các thuộc tính của chúng trong khi đóng gói các hoạt động sửa đổi chúng. các DTO chỉ đơn thuần là truyền dữ liệu đến lớp kiên trì và không yêu cầu logic. – flesh

Trả lời

3

Bạn có thể thử cách sau để cải thiện điều:

  • Sử dụng EF để lấy DTOs trong lớp dữ liệu của bạn, sau đó sử dụng những DTOs để cư đối tượng kinh doanh phong phú hơn trong lớp kinh doanh của bạn. Giao diện người dùng của bạn sẽ chỉ cần tham khảo lớp Doanh nghiệp.
  • Khi bạn đã tạo các đối tượng kinh doanh phong phú, bạn có thể bắt đầu để nội bộ hóa một số logic từ các lớp người quản lý, làm sạch hiệu quả lớp doanh nghiệp.

Cá nhân tôi thích mô hình phong phú hơn mô hình người quản lý bởi vì, như bạn nói, bạn kết thúc với một tải các phương pháp tĩnh, mà bạn chắc chắn sẽ kết nối với nhau bên trong các phương pháp tĩnh khác. Tôi thấy điều này quá lộn xộn và quan trọng hơn, khó hiểu hơn và đảm bảo tính nhất quán của các đối tượng của bạn tại bất kỳ thời điểm nào.

Nếu bạn đóng gói logic trong lớp, bạn có thể chắc chắn hơn về trạng thái của đối tượng bất kể bản chất của người gọi bên ngoài.

Một câu hỏi hay bằng cách này.

+0

Tôi thích ý tưởng của bạn - tuy nhiên, bạn sẽ không sao chép nhiều tác phẩm? Ví dụ: nếu DTO có nhiều thuộc tính khác nhau, bạn có thể sẽ tạo lại tất cả các thuộc tính đó trong phiên bản 'phong phú hơn' của lớp. Đúng? – bugfixr

+0

Sau khi bổ sung mặc dù - có bao giờ bạn thực hiện các lớp học trong lớp BLL của bạn mà kế thừa từ DTO trong lớp dữ liệu? Điều này sẽ cho phép một số tùy chỉnh. Suy nghĩ? Ý tưởng tồi? – bugfixr

+1

kế thừa sẽ làm tăng sự ghép nối giữa các lớp (thay vì giảm nó) và bạn có thể kết thúc với các phụ thuộc tham chiếu vòng tròn, điều này sẽ loại bỏ nó. Có thể sẽ có một số trùng lặp nhưng hãy nhớ EF có thể tạo DTO của bạn để tôi không lo lắng quá nhiều về điều đó .. – flesh

0

Tôi không phải chuyên gia, nhưng điều đó có vẻ khá tốt đối với tôi. Điều đó tương tự như những gì tôi có trong các giải pháp của mình, ngoại trừ tôi chỉ hợp nhất dự án EF với dự án kinh doanh. Giải pháp của tôi không phải là lớn, và các đối tượng của tôi không đòi hỏi nhiều thông minh, vì vậy nó tốt cho tôi. Tôi cũng có rất nhiều phương pháp khác nhau cho mỗi lớp trợ giúp tĩnh của tôi.

Nếu bạn không muốn lớp trình bày biết về lớp truy cập dữ liệu, thì bạn phải tạo một số lớp trung gian, có thể là rất nhiều công việc. Vậy vấn đề với thiết lập hiện tại của bạn là gì?

+1

Các phụ thuộc làm cho việc kiểm tra và sửa đổi các lớp riêng lẻ trở nên khó khăn hơn. Đối với một dự án nhỏ, nó có lẽ ít quan trọng. Nhưng đối với các dự án có quy mô lớn hơn và tuổi thọ thường được khuyến nghị có 0 sự phụ thuộc giữa các lớp của bạn thông qua việc sử dụng đảo ngược vùng chứa kiểm soát và các giao diện được xác định. Điều này hiện khá phức tạp để làm với các lớp Entity Framework được tạo ra. –

2

IMHO, bố cục hiện tại của bạn là tốt. Hoàn toàn bình thường đối với giao diện người dùng của bạn để tham chiếu lớp 'Dữ liệu' khi bạn đang gọi nó. Tôi nghĩ rằng có lẽ mối quan tâm của bạn đang phát sinh do thuật ngữ. 'Dữ liệu' mà bạn mô tả thường được gọi là lớp 'đối tượng doanh nghiệp' (BOL). Một bố cục chung sau đó sẽ là có một lớp logic nghiệp vụ (BLL) là lớp 'Người quản lý' của bạn và một lớp truy cập dữ liệu (DAL). Trong kịch bản của bạn, LINQ to Entites (giả sử bạn sẽ sử dụng nó) là DAL của bạn. Mẫu tham chiếu bình thường sẽ là: -

Tham chiếu giao diện người dùng BLL và BOL. BLL refences BOL và DAL (LINQ to Entites).

Hãy xem this series of articles để biết thêm chi tiết.

+0

Tôi thấy quan điểm của bạn. Mặc dù trong trường hợp của EF, tôi không có lựa chọn nào khác ngoài việc kết hợp BOL với DAL vì BOL được tạo ra bởi thuật sĩ tạo ra EF. Tôi có thiếu gì không? – bugfixr

+0

Xin lỗi, tuyên bố sai về phía tôi. EF không phải là DAL của bạn. Bất cứ lớp nào bạn sử dụng để lấy các mục ra khỏi cơ sở dữ liệu sẽ là DAL của bạn, có lẽ là LINQ to Entitites. Trong trường hợp đó, mô hình tôi mô tả vẫn giữ. BOL được tạo của bạn vẫn chỉ là BOL, sử dụng EF. Tôi sẽ chỉnh sửa bài đăng. –

0

Bố cục của bạn có vẻ ổn. tôi sẽ có thêm một tiện ích/lớp Common

UI Web
Business lớp
DataObjects
Utilities lớp

2

Đối với câu hỏi thứ hai của bạn (sau khi EDIT) nếu bạn cần hoặc muốn thêm các tính năng đối với các đối tượng EF của bạn, bạn có thể sử dụng các lớp một phần. Nhấp chuột phải vào tệp EDMX và chọn mã xem.

Hoặc nếu điều này là không đủ để bạn có thể bỏ thiết kế và viết các lớp học hỗ trợ EF của riêng bạn.

Có một (tóm tắt) thảo luận về cả hai lựa chọn ở đây - http://msdn.microsoft.com/en-us/library/bb738612.aspx

0

tôi sẽ thêm DTOs đến lớp kinh doanh của bạn được "đối tượng câm" cơ quan đại diện (ví dụ: chỉ tính) của thực thể trong lớp dữ liệu của bạn. Sau đó, các lớp "Người quản lý" của bạn có thể trả lại, chẳng hạn như:

class PlanetManager 
{ 
    public static PlanetDTO GetPlanet(int id) { // ... } 
} 

và giao diện người dùng của bạn chỉ có thể xử lý lớp BLL qua POCO; Trình quản lý (cái mà tôi gọi là lớp "Mapper") xử lý tất cả việc dịch giữa các đối tượng và lớp dữ liệu. Ngoài ra, nếu bạn cần mở rộng lớp, bạn có thể có thuộc tính "ảo" trên đối tượng DTO và yêu cầu Trình quản lý dịch trở lại thành phần của nó.

1

Đối với câu hỏi thứ hai của bạn trong "EDIT" phần:

Nếu tôi không nhầm, các lớp được tạo ra bởi EF không được niêm phong, và họ là MỘT PHẦN lớp, vì vậy bạn có thể dễ dàng mở rộng những mà không cần chạm vào các tệp đã tạo.

Lớp tạo ra sẽ là:

public partial class Planet : global::System.Data.Objects.DataClasses.EntityObject 
{ 
... 
} 

để bạn có thể dễ dàng tạo ra riêng "PlanetAddons.cs" của bạn (hoặc bất cứ điều gì bạn muốn gọi nó) để mở rộng lớp này:

public partial class Planet 
{ 
property int Population {get; set;} 
... 
} 

Khá gọn gàng, eh? Không cần phải lấy ra và tạo các hệ thống phân cấp đối tượng nhân tạo ....

Marc

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