2009-09-20 32 views
5

Tôi đã đi qua các hướng dẫn (đặc biệt là những người sử dụng LINQ-To-Entities) và tôi hiểu các khái niệm cơ bản, tuy nhiên một số điều đang mang lại cho tôi các vấn đề.Ứng dụng ASP.NET MVC của tôi có được cấu trúc đúng cách không?

Các hướng dẫn thường chỉ liên quan đến các mô hình và biểu mẫu đơn giản chỉ sử dụng các câu lệnh tạo, cập nhật và xóa cơ bản. Mỏ phức tạp hơn một chút, và tôi không chắc mình sẽ đi đúng hướng bởi vì khi đến lúc xử lý các mối quan hệ của một nửa tá đối tượng cơ sở dữ liệu, các hướng dẫn sẽ dừng lại.

Đối với bài phương pháp, cách thông thường thực hiện các thao tác CRUD

entities.AddToTableSet(myClass); 
entities.SaveChanges(); 

Sẽ không làm những gì tôi muốn, bởi vì một lớp học thực hiện đầy đủ là không nhận được được đưa lên các phương pháp điều khiển. Tôi có thể đăng từng trường, bộ sưu tập biểu mẫu hoặc nhiều đối tượng DTO rồi gọi phương thức trên dịch vụ hoặc kho lưu trữ để lấy thông tin tôi nhận được từ bài đăng biểu mẫu, cùng với thông tin cần truy vấn hoặc tự tạo và sau đó từ tất cả những điều đó, tạo đối tượng cơ sở dữ liệu của tôi mà tôi có thể lưu.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Add(int id, [Bind(Exclude = "Id")] ClassA classA, 
         [Bind(Exclude = "Id")]ClassB classB) 
{ 
    // Validation occurs here 

    if(!ModelState.IsValid) 
     return View(); 

    try 
    { 
     _someRepositoryOrService.Add(id, classA, classB); 
     return RedirectToAction("Index", new { id = id }); 
    } 
    catch(Exception ex) 
    { 
     // Logging and exception handling occurs here 
    } 
} 


public void Add(int id, ClassA classA, ClassB classB) 
{ 
    EntityA eA = new EntityA 
    { 
     // Set a bunch of properties using the two classes and 
     // whatever queries are needed 
    }; 

    EntityB eB = new EntityB 
    { 
     // Set a bunch of properties using the two classes and 
     // whatever queries are needed 
    }; 

    _entity.AddToEntityASet(eA); 
    _entity.AddToEntityBSet(eB); 
    _entity.SaveChanges(); 
} 

Tôi có xử lý chính xác hoặc tôi đang bế khuôn khung công tác không? Tôi không bao giờ thực sự sử dụng một đối tượng thực thể trực tiếp, bất cứ khi nào tôi truy vấn một đối tượng, tôi đặt thông tin mình cần trong một DTO và căn cứ vào các Views của tôi. Cùng đi với sáng tạo. Điều này có được phép hay là việc tránh sử dụng các thực thể trực tiếp chống lại mục đích sử dụng khung công tác?

Chỉnh sửa: Tôi cũng lo lắng về phương pháp này vì nó đòi hỏi nhà xây dựng có sản phẩm nào để làm đúng các truy vấn LINQ vì thông báo lỗi này:

Chỉ constructor parameterless và initializers được hỗ trợ trong LINQ to Entities .

Đây không phải là vấn đề lớn vì tôi hiếm khi cần logic trong các nhà xây dựng, nhưng đây có phải là vấn đề không có nhà thầu và chỉ các thuộc tính công khai không?

+1

Ngữ cảnh đối tượng được sử dụng bởi LINQ to Entities sử dụng sự phản chiếu để tạo các đối tượng từ ánh xạ dữ liệu, điều quan trọng và yêu cầu tất cả các thực thể đều có một hàm tạo tham số để nó có thể được khởi tạo nếu bạn muốn có thể sắp xếp theo kiểu của mình sẽ cần một nhà xây dựng công cộng quá – dmportella

Trả lời

4

_someRepositoryOrService.Add (id, classA, classB);

Tôi sẽ nói bạn ghép đôi kho lưu trữ của bạn với lớp trình bày. Điều này không nên. Các kho lưu trữ của bạn chỉ nên hoạt động với các thực thể.Tiếp theo, hãy chú ý cách phương pháp

public void Add (int id, ClassA classA, ClassB ClassB)

phá vỡ tách mối quan tâm (SoC) Add bạn. Nó thực hiện hai nhiệm vụ:

  1. bản đồ xem dữ liệu thành các tổ chức
  2. Lưu vào kho

Rõ ràng là bước đầu tiên cần được thực hiện trong lớp trình bày. Hãy xem xét sử dụng chất kết dính mô hình cho việc này. Nó cũng có thể giúp bạn giải quyết vấn đề của nhà thầu, vì các chất kết dính mô hình của bạn có thể được nhận biết về các yêu cầu xây dựng.

Kiểm tra cũng xuất sắc này post bởi Jimmy Bogard (đồng tác giả của ASP.NET MVC In Action) về ViewModels. Điều này có thể giúp bạn tự động hóa ánh xạ. Nó cũng gợi ý một kỹ thuật đảo ngược - làm cho bộ điều khiển của bạn làm việc với các thực thể chứ không phải ViewModels! Các bộ lọc hành động tùy chỉnh và các bộ mô hình hóa thực sự là chìa khóa để loại bỏ thường trình mà không thực sự thuộc về bộ điều khiển mà là một chi tiết cơ sở hạ tầng giữa khung nhìn và bộ điều khiển. Ví dụ, here 's làm thế nào tôi tự động hóa các thực thể retrival. Here 's làm thế nào tôi thấy những gì bộ điều khiển nên làm.

Mục tiêu ở đây là làm cho các trình điều khiển nội dung hóa về quản lý logic nghiệp vụ, đặt sang một bên tất cả các chi tiết kỹ thuật không thuộc về doanh nghiệp của bạn. Đó là những hạn chế về công nghệ mà bạn nói đến trong câu hỏi này, và bạn để chúng rò rỉ vào mã của bạn. Nhưng bạn có thể sử dụng các công cụ MVC để di chuyển đến mức cơ sở hạ tầng.

CẬP NHẬT: Không, kho không được xử lý dữ liệu biểu mẫu, đó là ý của tôi là "ghép nối với bản trình bày". Có, kho lưu trữ nằm trong bộ điều khiển, nhưng chúng không hoạt động với dữ liệu biểu mẫu. Bạn có thể (không phải là bạn nên) làm cho biểu mẫu hoạt động với "dữ liệu kho" - tức là các thực thể - và đó là những gì hầu hết các ví dụ làm, ví dụ: NerdDinner - nhưng không phải theo cách khác. Điều này là do quy tắc chung của ngón tay cái - các lớp cao hơn có thể được kết hợp với các lớp thấp hơn (trình bày kết hợp với kho và thực thể), nhưng không bao giờ được kết hợp với cấp cao hơn (thực thể phụ thuộc vào kho, kho lưu trữ phụ thuộc vào mẫu biểu mẫu, v.v.).

Bước đầu tiên phải được thực hiện trong kho lưu trữ, đúng vậy - ngoại trừ việc ánh xạ từ ClassX sang EntityX không thuộc bước đó. Đó là mối quan tâm về bản đồ - một cơ sở hạ tầng. Xem ví dụ this câu hỏi về ánh xạ, nhưng nói chung nếu bạn có hai lớp (giao diện người dùng và kho lưu trữ), chúng không nên quan tâm đến ánh xạ - một dịch vụ/trình trợ giúp người lập bản đồ nên. Bên cạnh blog của Jimmy, bạn cũng có thể đọc ASP.NET MVC In Action hoặc chỉ cần xem CodeCampServer của họ về cách ánh xạ với giao diện IEntityMapper được truyền cho các nhà xây dựng điều khiển (lưu ý rằng đây là phương pháp thủ công và ít tốn kém hơn cho AutoMapper của Jimmy Bogard).

Một điều nữa. Đọc về Domain Driven Design, tìm kiếm các bài viết, học hỏi từ chúng, nhưng bạn không phải theo dõi mọi thứ. Đây là những hướng dẫn, không phải là giải pháp nghiêm ngặt. Xem liệu dự án của bạn có thể xử lý điều đó hay không, xem bạn có thể xử lý điều đó hay không. Hãy thử áp dụng các kỹ thuật này vì chúng thường là những cách tuyệt vời và được chấp thuận để phát triển, nhưng đừng dùng chúng một cách mù quáng - tốt hơn là nên học theo cách hơn là áp dụng một cái gì đó bạn không hiểu.

+0

Để ghép nối các kho lưu trữ, tôi không chắc chắn ý của bạn là gì, việc có một kho lưu trữ trong bộ điều khiển có vẻ là điều mà hầu hết các hướng dẫn đều làm. Đối với bước đầu tiên được thực hiện trong lớp trình bày, không nên thực hiện trong kho lưu trữ? Tôi nghĩ mục đích của kho lưu trữ là phải lo lắng về việc xử lý dữ liệu biểu mẫu để chuyển đổi cơ sở dữ liệu? – Brandon

+0

Cũng cảm ơn bạn vì các ví dụ và lời khuyên. Tôi không có thời gian để thực sự thực hiện các thay đổi, nhưng đó là một cú huých đẹp theo đúng hướng. – Brandon

+0

Xem cập nhật. Tôi sẽ đề xuất để refactor từ từ, ví dụ đầu tiên làm _realEntityRepository.Add (EntityMapper.From (classA)); (hoặc classA.MapToEntity()), sau đó liên quan đến ModelBinder tùy chỉnh (là một chủ đề lớn), sau đó thêm IoC container (một chủ đề lớn khác), v.v. – queen3

4

Tôi sẽ nói rằng việc sử dụng DTO và gói Khung thực thể bằng các phương thức truy cập dữ liệu của riêng bạn và lớp kinh doanh là một cách tuyệt vời để thực hiện. Bạn có thể sẽ viết rất nhiều mã, nhưng đó là một kiến ​​trúc tốt hơn là giả vờ mã tạo ra Entity Framework là lớp nghiệp vụ của bạn.

Những vấn đề này không nhất thiết phải gắn với ASP.NET MVC theo bất kỳ cách nào. ASP.NET MVC cho về cơ bản không có hướng dẫn về làm thế nào để làm mô hình của bạn/truy cập dữ liệu và hầu hết các mẫu và hướng dẫn cho ASP.NET MVC không phải là sản xuất mô hình thực hiện xứng đáng, nhưng thực sự chỉ là mẫu tối thiểu.

Dường như bạn đang đi đúng hướng, tiếp tục. Cuối cùng, bạn đang sử dụng Entity Framework chủ yếu như một trình tạo mã không tạo mã rất hữu ích và vì vậy bạn có thể muốn xem xét các trình tạo mã khác hoặc các công cụ hoặc khung công cụ phù hợp hơn với yêu cầu của bạn.

+0

Tôi thực sự chỉ sử dụng khung Entity để thử một cái gì đó mới. Tôi đang sử dụng để sử dụng nHibernate. Bạn có bất cứ đề nghị cho một máy phát điện tốt hơn hoặc khung tôi nên sử dụng? – Brandon

+0

Tôi không biết bất cứ điều gì phù hợp với nhu cầu của bạn. Một số trong số này là thương mại và một số là miễn phí. Không theo thứ tự cụ thể: Mẫu T4, CodeSmith, LLBLGen Pro. –

+1

Đây hầu hết là một câu trả lời rất hay (+1), nhưng tôi không đồng ý rằng anh ta đang sử dụng Entity Framework làm trình tạo mã. Điều quan trọng hơn nhiều là anh ta đang sử dụng khung Entity để ánh xạ cơ sở dữ liệu của mình vào không gian đối tượng. Điều này là quan trọng ngay cả khi bạn không bao giờ thực sự hiện thực hóa một loại thực thể; bạn vẫn sử dụng các thực thể ánh xạ trong các truy vấn LINQ to Entities của bạn khi bạn chiếu chúng lên các kiểu khác. –

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