2011-10-10 15 views
5

Tôi đang tìm kiếm một số cuộc thảo luận với bài đăng này.ExpandoObject vào đối tượng tĩnh và ngược lại. Kéo dài hai miền

Tôi đang xem xét kết hợp các tính năng động C# 4.0 vào hệ thống cũ. Ví dụ rõ ràng của tôi là sử dụng Massive của Rob Connery trong một lớp dữ liệu. Nhưng các câu hỏi của tôi sẽ áp dụng ở bất cứ nơi nào một đối tượng động phải tương tác với một đối tượng kinh doanh hiện có, được đánh máy mạnh mẽ sao cho có một ánh xạ giữa các thuộc tính.

Tôi có thể tự động chuyển đổi sang và từ (bê tông) tĩnh vật và các đối tượng expando với hai phương pháp (giản thể) sau:

public static object ToConcrete<T>(System.Dynamic.ExpandoObject dynObject) 
    { 
     object instance = Activator.CreateInstance<T>(); 
     var dict = dynObject as IDictionary<string, object>; 
     PropertyInfo[] targetProperties = instance.GetType().GetProperties(); 

     foreach (PropertyInfo property in targetProperties) 
     { 
      object propVal; 
      if (dict.TryGetValue(property.Name, out propVal)) 
      { 
       property.SetValue(instance, propVal, null); 
      } 
     } 

     return instance; 
    } 

    public static System.Dynamic.ExpandoObject ToExpando(object staticObject) 
    { 
     System.Dynamic.ExpandoObject expando = new ExpandoObject(); 
     var dict = expando as IDictionary<string, object>; 
     PropertyInfo[] properties = staticObject.GetType().GetProperties(); 

     foreach (PropertyInfo property in properties) 
     { 
      dict[property.Name] = property.GetValue(staticObject, null); 
     } 

     return expando; 
    } 

Nhưng bây giờ tôi có một số câu hỏi.

Nỗ lực của tôi để mở rộng năng động và không năng động trong một hệ thống cũ thể hiện quan niệm sai lầm về phía tôi? Có nghĩa là, tôi đang làm việc chống lại ý định năng động? Tôi có tự đặt mình lên cho các vấn đề không?

Liệu việc sử dụng động lực của tôi có bị hạn chế đối với các thành phần chứa hoàn toàn không có ánh xạ giữa các đối tượng động và các đối tượng tĩnh không? Có nghĩa là, thực tiễn không tốt để cố gắng kết hợp hai miền ngôn ngữ? Tôi có tạo ra kiến ​​trúc xấu không? Một anti-pattern?

Trong trường hợp của một thành phần như Massive, nếu chúng ta nói rằng thực hành không tốt để ánh xạ giữa ExpandoObject và các đối tượng được nhập mạnh, thì không có cách nào tôi có thể cắm nó vào hệ thống cũ của mình. mã kế thừa và không có cách thực tế nào tôi có thể, hoặc nên, tái cấu trúc các đối tượng của một cơ sở mã lớn, kế thừa thành các đối tượng động. Có thể động không thể được thêm vào thực tế vào cơ sở mã .Net cũ. Có lẽ nó phải được kết hợp ngay từ đầu, hoặc không phải ở tất cả.

+0

Động lực nào bạn phải sử dụng 'ExpandoObject's? – svick

Trả lời

2

Vì vậy, bạn chỉ muốn ánh xạ các đối tượng được nhập tĩnh vào đối tượng động để chúng có thể được sử dụng trong Massive. Tôi nghĩ rằng điều này là tốt, nó giống như lập bản đồ đối tượng kinh doanh để LINQ to SQL đối tượng để bạn có thể làm việc với ORM đó. Một nhược điểm mặc dù là bạn sẽ kết thúc lập bản đồ tất cả mọi thứ trong và ngoài cơ sở dữ liệu của bạn. Điều này có thể trở thành nỗi đau. Đó là một nỗi đau cho tôi với LINQ to SQL.

Hãy suy nghĩ về việc sẽ thay đổi mã như thế nào và bạn đo lường mức độ hiệu quả của phương pháp này. Đối với tôi, khi tôi cần phải thêm một tài sản cho một đối tượng kinh doanh, tôi phải:

  1. Thêm tài sản cho đối tượng
  2. Viết di cư DB để thay đổi bảng
  3. Tái Phục LINQ to Tệp SQL
  4. Lập bản đồ thuộc tính mới

Đây là một nỗi đau. Cách tiếp cận của bạn với Massive, nếu những người giúp đỡ bản đồ của bạn làm việc một cách chính xác, nghĩa là bạn phải làm:

  1. Thêm tài sản cho đối tượng
  2. Viết di cư DB để thay đổi bảng

Đó không phải là xấu. Ngoài ra, các đồ thị đối tượng sẽ được xử lý như thế nào? Nếu bạn có bảng Person và bảng Address với mối quan hệ 1-M nghĩa là một người có thể có nhiều địa chỉ. Làm cách nào để bạn có thể truy vấn và nhận danh sách những người có địa chỉ của họ? Bản đồ của bạn sẽ trông như thế nào?

Một cách tiếp cận khác là xem liệu NHibernate hoặc Entity Framework có hoạt động trong tình huống của bạn hay không. Chúng được thiết kế để làm việc với các đối tượng được gõ tĩnh. Có vẻ như nó được thiết kế để truy cập dữ liệu nhanh chóng và dễ dàng. Một thư viện nhanh chóng và dễ dàng khác được xây dựng cho các đối tượng được nhập tĩnh là Dapper. Rất dễ sử dụng. Kiểm tra nó trên Nuget. Trên thực tế, từ những gì tôi hiểu về tình hình của bạn, tôi rất muốn xem xét Dapper.

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