2010-01-18 37 views
6

Tôi có một mô hình dữ liệu được nhiều ứng dụng sử dụng mà giờ đây tôi cần được các nhà phát triển khác bên ngoài sử dụng. Mô hình chỉ nên được thực hiện một phần cho các nhà phát triển.xác định giao diện

Tôi tự hỏi làm cách nào tôi tiếp cận tốt nhất điều này: phương pháp hiện tại của tôi là tạo một dự án mới chỉ sao chép mô hình gốc và chỉ bao gồm các thuộc tính được yêu cầu.

ví dụ

namespace Model 
{ 
    public class Car 
    { 
     private double m_speed; 
     private FuelType m_fuelType; 

     public double Speed 
     { 
      get { return m_speed; } 
      set { m_speed = value; } 
     }  


     public FuelType FuelType 
     { 
      get { return m_fuelType; } 
      set { m_fuelType = value; } 
     } 
    } 
} 

Trong Lite mẫu của tôi, tôi chỉ muốn để lộ tốc độ:

using Model; 

namespace ModelLite 
{ 
    public class Car 
    { 
     private Model.Car car = new Model.Car(); 

     public double Speed 
     { 
      get { return this.car.Speed; } 
      set { this.car.Speed = value; } 
     } 

    } 
} 

Kể từ khi mô hình này là lớn này liên quan đến trong rất nhiều sự trùng lặp. Có lẽ có một lựa chọn tốt hơn?

Cảm ơn

Trả lời

2

Hãy nhìn vào những tác phẩm của Martin Fowler trên Application FacadesFacade Pattern

+0

Tôi nghĩ rằng liên kết dành cho Mặt tiền ứng dụng phải là http: // martinfowler.com/apsupp/appfacades.pdf – Kane

+0

Đã thay đổi. Cảm ơn bạn. –

2

Không có giải pháp cho vấn đề này. Nếu các nhà phát triển khác nhau chỉ được phép truy cập một phần vào các trường, bạn sẽ cần phải tạo các nguồn cấp dữ liệu khác nhau cho các nhà phát triển khác nhau.


Mặc dù mô hình của bạn chỉ có vẻ không đúng với tôi, bạn có thể tuy nhiên thực hiện điều này bằng cách:

  • Tạo một đối tượng thức ăn đó có tất cả các thuộc tính của đối tượng chính cũng có
  • Tạo một số thuộc tính như :

class FeedSecurityAttribute : Attribute 
{ 
     public FeedSecurityAttribute(params string[] rights) {} 
} 

  • Thêm chú thích trên các thuộc tính của thức ăn xác định người có quyền truy cập vào thuộc tính này như [FeedSecurity("piet", "klaas")] string MyProperty { get;set; }
  • Điền đối tượng thức ăn của bạn từ một đối tượng kinh doanh tự động sử dụng một số phản ánh và biểu hiện cây, và kiểm tra xem người dùng có quyền truy cập đến tài sản, nếu không thì hãy bỏ qua nó.
0

Bạn có thể có thể xem xét sử dụng nhiều giao diện

public interface ICarBasic 
{ 
    double Speed { get; set; } 
} 

public interface ICar : ICarBasic 
{ 
    FuelType FuelType { get; set; } 
} 

Hoặc Viết tất cả các đối tượng cơ bản của bạn như các lớp học cơ sở. Thừa kế chúng để tạo ra các lớp đầy đủ bằng cách sử dụng một assembly mới. Cho các nhà phát triển ra bên ngoài dự án chỉ lắp ráp với các lớp cơ sở trong có thể giải quyết vấn đề của bạn.

hội 1 (Đối với các Devs khác)

using Model;   

namespace ModelLite   
{   
    public class Car   
    {   
     private Model.Car car = new Model.Car();   

     public double Speed   
     {   
      get { return this.car.Speed; }   
      set { this.car.Speed = value; }   
     }   

    }   
}  

hội 2 (bật đầy đủ)

using ModelLite 

namespace Model   
{   
    public class Car : ModelLite.Car   
    {   
     private FuelType m_fuelType;   

     public FuelType FuelType   
     {   
      get { return m_fuelType; }   
      set { m_fuelType = value; }   
     }   
    }   
}  

Chỉ cho lắp ráp từ 1 tới các nhà phát triển khác.

+0

Điều này về cơ bản là những gì Tarscher nói trong bài đầu tiên của mình. Điều này là không thể duy trì khi bạn cần hỗ trợ điều này cho> X phiên bản nguồn cấp dữ liệu khác nhau. –

+0

Bài đăng gốc là cách khác. Anh ta đang thực hiện tốc độ hai lần. Đề nghị của tôi chỉ có nó một lần. Và kể từ khi có Inheritence được unmaintainable? – Nanook

+0

Không thể duy trì được nếu bạn có 'Mô hình xe hơi {class; Năm; Nhiên liệu; } 'và muốn vạch trần' Mô hình; Năm, 'cho một người, 'Nhiên liệu; Mô hình, 'khác, và' Năm; Nhiên liệu; 'cho người khác. –

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