2012-05-03 41 views
7

Tôi vừa bắt đầu làm việc trên một dự án MVC và mọi thứ sẽ ổn nhưng có vẻ như tôi đang tạo ra rất nhiều mã spaghetti chỉ với quá nhiều đối tượng. Bất cứ ai có thể xem làm thế nào tôi có thể đơn giản hóa giải pháp này trước khi toàn bộ dự án được ra khỏi bàn tay?ASp.NET MVC - Có thể đơn giản hóa kiến ​​trúc của tôi không?

ok, đây là bộ của tôi lên:

Dal - có kết nối khung Entity và phương pháp để có được dữ liệu sau đó chuyển đổi dữ liệu với các đối tượng mô hình của tôi trong lớp mô hình

BLL - gửi dữ liệu sao lưu vào giao diện người dùng Mô hình - điều này chứa tất cả các đối tượng mô hình được sử dụng trên toàn bộ trang web, bất kỳ thứ gì đến từ DAL đều được chuyển đổi thành các đối tượng này bằng cách tạo một đối tượng mới rồi điền các biến.

UI - giải pháp MVC của tôi

Các Dal, BLL và mẫu cũng được sử dụng bởi các giải pháp khác.

Bây giờ với MVC, tôi đang cố gắng sử dụng chú thích xác nhận ([Bắt buộc], v.v.) có nghĩa là tôi phải tạo lại các đối tượng mô hình bằng các chú thích. Điều này là tốt nhưng nếu tôi muốn lưu dữ liệu trở lại vào cơ sở dữ liệu tôi cần phải chuyển đổi các lớp học mà chỉ là lộn xộn.

Mọi người có thể xem cách tôi có thể sử dụng thư viện lớp mô hình hiện tại của mình với các đối tượng mô hình MVC sử dụng chú thích xác thực không?

Nếu tôi chưa giải thích rõ ràng, vui lòng cho tôi biết và tôi sẽ cung cấp thêm chi tiết.

Cảm ơn

Trả lời

3

Lý tưởng nhất là cần phải có một sự tách biệt từ các mô hình tên miền trên một tay và mô hình MVC (họ có thực sự ViewModels) mặt khác. Sự tách biệt này thực sự rất quan trọng và được khuyến khích mạnh mẽ.

Chúng sẽ trông giống nhau trong hầu hết các trường hợp mặc dù ViewModel có thể chứa nội dung bổ sung. Sau đó, bạn có thể sử dụng AutoMapper để chuyển đổi từ một đến khác.

Ví dụ:

public class User // in entity DLL 
{ 
    [Required] 
    public string Name {get; set;} 
} 

public class UserViewModel : User // in MVC DLL 
{ 
    public string LastVisitedPage {get; set;} // which only MVC needs to know 
} 

Mapper.Map<User, UserViewModel>(); 
Mapper.Map<UserViewModel, User>(); 
+0

Hi, chỉ có automapper và đây là rực rỡ !!! cảm ơn rất nhiều! Điều này tiết kiệm rất nhiều bản đồ tẻ nhạt :) – Funky

+0

@Funky có, nó thực sự là một công cụ hữu ích. – Aliostad

1

bạn có thể đặt các siêu dữ liệu trong đối tượng siêu dữ liệu mà không cần tái tạo các đối tượng mô hình. Đây là một cách rất đơn giản để thực hiện nó, tuy nhiên nó yêu cầu chính các đối tượng mô hình được đánh dấu là một phần. Tôi hy vọng đó là OK nếu không giải pháp này sẽ không làm việc cho bạn.

[MetadataType(typeof(PreviousResultsMetaData))] 
public partial class PreviousResults 
{ 
    public class PreviousResultsMetaData 
    { 
     [DisplayName("Class Ranking Score")] 
     [Required] 
     [Range(0.0, 100.0)] 
     public object ClassRankingScore { get; set; } 
    } 
} 

trong ví dụ trên có đối tượng mô hình dữ liệu được gọi là PreviousResults được tạo ở nơi khác bởi một số mã giàn giáo. Nó định nghĩa đối tượng POCO được gửi đến và đi từ cơ sở dữ liệu bằng LINQ. Thuộc tính MetadataType cho biết lớp sẽ được sử dụng để lưu trữ siêu dữ liệu. Sau đó, bạn chỉ cần tạo các đối tượng đơn giản khớp với tên của các thành viên dữ liệu thực của bạn và chú thích chúng.

Tôi hy vọng điều này sẽ hữu ích.

0

Bạn hoàn toàn có thể thêm thuộc tính vào BLL của mình (pháp nhân kinh doanh). Chỉ cần thêm tham chiếu và thêm tuyên bố sử dụng cho System.ComponentModel.DataAnnotations. Ngoài ra, bạn có thể thực hiện giao diện IValidatableObject (khá dễ dàng, xem bên dưới).

Đối với ánh xạ, bạn có thể sử dụng ví dụ AutoMapper, vì vậy bạn không cần phải viết nhiều bản đồ logic (nếu bạn có thể tận dụng phép thuật ánh xạ tên).

Validate dụ:

ICollection<ValidationResult> validationErrors = new List<ValidationResult>(); 
var validationContext = new ValidationContext(this, null, null); 
Validator.TryValidateObject(this, validationContext, ValidationErrors, true); 

return validationErrors; 
Các vấn đề liên quan