2012-12-19 36 views
7

Chúng tôi đang phát triển một kiến ​​trúc ứng dụng N-tier sử dụng WCF giữa client (trình bày) và máy chủ (data/lớp kinh doanh). Thành thật mà nói, tôi không thể tìm thấy bất kỳ ví dụ/thông tin thực tế nào về cách hiển thị dữ liệu được tính toán hiệu quả thông qua WCF.Làm thế nào để lộ dữ liệu tính toán của một doanh nghiệp thông qua WCF

Đối với mô tả vấn đề của tôi nói rằng chúng ta có máy ATM mà có rất nhiều giao dịch. Vì vậy, chúng tôi có mối quan hệ 1-N giữa Lớp ATM và Lớp giao dịch. ATM Class có các thuộc tính như Location, ModelNo, Description, InstallDate và các bản ghi Transaction có thông tin như Amount, DateTime, CustomerInfo, TicketPaperLength, ElectricityUsed

Hiển thị các lớp này thông qua WCF không phải là vấn đề. Vấn đề là chúng ta có rất nhiều trường được tính toán cho ATM dựa trên bảng Giao dịch cơ bản. Ví dụ: ứng dụng khách sử dụng báo cáo dựa trên dữ liệu được tính toán của ATM. Ví dụ về các dữ liệu tính toán của máy ATM có thể là: AverageTicketPaperLength, AverageAmount, DeviationAmount, AverageElectricity, vv, vv Có rất nhiều và rất nhiều những dữ liệu tính toán. Các tính toán sẽ diễn ra trên máy chủ chứ không phải ở phía máy khách. Nếu tất cả các định nghĩa báo cáo này đã được khắc phục thì đó không phải là vấn đề lớn: chúng tôi có thể tạo các dịch vụ riêng biệt/Poco, cho các báo cáo. Đặt các tính toán trong một lớp kinh doanh và điền vào Poco khi cần thiết. Nhưng ứng dụng khách phải có khả năng tạo báo cáo được lọc trên bất kỳ tập hợp các thuộc tính được tính toán nào của ATM và trả về dưới dạng dữ liệu khác của các thuộc tính (được tính toán).

tôi có thể tạo ra một Poco với khoảng 500 tài sản tính toán, nơi có cho mỗi báo cáo duy nhất chỉ có thể là 10 tính sẽ được sử dụng. Nhưng tất nhiên chúng tôi không muốn tất cả 500 phép tính được thực hiện mỗi lần cho mỗi và mọi thực thể.

Vì vậy, nói chung, tôi tự hỏi làm cách nào để hiển thị dữ liệu được tính toán của một thực thể thông qua ví dụ: WCF. Hầu như tất cả các ví dụ tôi thấy giải thích Entity Framework, Poco và WCF chỉ đối phó với các trường dai dẳng của thực thể và đó là khá thẳng về phía trước.

Trả lời

7

Không để các đối tượng thông qua WCF, tạo ra một số DTOs.

Ví dụ:

Trong lớp WCF -

DtoInfoForReport1 GetInfoForReport1(long atmId) { ... call BL here... } 
DtoInfoForReport2 GetInfoForReport2(long atmId) { ... call BL here... } 

Trong lớp dữ liệu -

AtmEntity 
{ 
    long Id {get;set;} 
    ... some properties ... 
    HashSet<Transaction> AtmTransactions {get;set;} 
} 

đối tượng chuyển giao -

DtoInfoForReport1 
{ 
    long AtmId {get;set;} 
    XXX SomeCalculatedValue {get;set;} 
} 

Trong BL -

DtoInfoForReport1 CreateInfoForReport1(long atmId) 
{ 
    var atm = YYY.GetEntity<AtmEntity>(atmId); 
    return new DtoInfoForReport1 
    { 
    AtmId = atmId, 
    SomeCalculatedValue = DoSomeCalculationOverMyAtmWithItsTransactions(atm), 
    }; 
} 

Hy vọng tôi có câu hỏi của bạn đúng. Nếu không bình luận.

Chỉnh sửa dựa trên nhận xét: Thần I sẽ đề nghị DTOs như thế này:

[DataContract] 
public DtoRequestedCalculations 
{ 
    [DataMember] 
    public long AtmId {get;set;} 

    [DataMember] 
    public List<DtoRequestedCalculationEntry> Calculations {get;set;} 
} 

[DataContract] 
public DtoRequestedCalculationEntry 
{ 
    [DataMember] 
    public string/long/Guid/XXX ParameterIdentifier {get;set;} 

    [DataMember] 
    public double/ DtoParameterCalculatedValueBase {get;set;} 
} 

Bây giờ nếu giá trị tính của bạn luôn được tăng gấp đôi nó về cơ bản hoàn thành. Nếu giá trị của bạn có thể hoặc các loại khác nhau, bạn sẽ cần một số lớp cơ sở - DtoParameterCalculatedValueBase, đó là sth như thế này:

[DataContract] 
[KnownType(typeof(DtoParameterDoubleCalculatedValue))] 
[KnownType(typeof(DtoParameterXXXCalculatedValue))] 
public DtoParameterCalculatedValueBase 
{ 
    ...whatever common part there may be or nth... 
} 

public DtoParameterDoubleCalculatedValue : DtoParameterCalculatedValueBase 
{ 
    [DataMember] 
    public double Value {get;set;} 
} 

public DtoParameterXXXCalculatedValue : DtoParameterCalculatedValueBase 
{ 
    [DataMember] 
    public XXX Value {get;set;} 
} 

Note thuộc tính KnownType - nó nói với WCF những loại có thể đến ở vị trí của lớp cơ sở.Bạn sẽ phải cung cấp thuộc tính này cho từng loại được kế thừa (hoặc sử dụng DataContractResolver, vốn đã là một câu chuyện khác).

Thần trong WCF:

DtoRequestedCalculations GetCalculatedValuesForAtm(long atmId, List<long/string/ Guid/XXX> valueIdentifiers); 
+0

Nói chung tôi đồng ý sử dụng DTO của. Lời giải thích của bạn chỉ ra vấn đề của tôi. Vấn đề là tôi không biết định nghĩa chính xác của ví dụ GetInfoForReport1 và GetInfoForReport2 ở phía trước. Cũng có thể có các báo cáo khác và tôi không biết dữ liệu nào người dùng yêu cầu. Người dùng cuối chọn một số trường được tính toán từ máy ATM và yêu cầu báo cáo. Để tạo DTO cho mỗi tổ hợp có thể có của các trường là hơi quá nhiều – Erik

+0

Cập nhật câu trả lời –

+0

ok, sau đó với WCF GetCalculatedValuesForAtm ý tưởng là giá trịIdentifiers tham chiếu đến các phép tính tương ứng? Nhưng điều này vẫn sẽ yêu cầu nếu bạn muốn có một danh sách các máy ATM có mức độ trung bình cao, bạn sẽ phải lặp qua tất cả các máy ATM và gọi WCF này cho AverageElectricity cho mỗi máy ATM. (chỉ cần nhận ra rằng tôi có nghĩa là báo cáo trên tất cả các máy ATM thay vì một báo cáo của 1 ATM. Điều này đã không được đề cập trong câu hỏi gốc) – Erik