[英]How to expose calculated data of an entity through WCF
我們正在客戶端(演示)和服務器(數據/業務層)之間使用WCF開發N層架構應用程序。 說實話,我找不到任何關於如何通過WCF公開有效計算數據的實例/信息。
為了描述我的問題,我們說ATM機有很多交易。 所以我們在ATM Class和Transaction類之間有一個1-N的關系。 ATM類具有Location,ModelNo,Description,InstallDate等屬性,並且Transaction記錄包含Amount,DateTime,CustomerInfo,TicketPaperLength,ElectricityUsed等信息
通過WCF公開這些類不是問題。 問題是我們有很多基於底層Transaction表的ATM計算字段。 例如,客戶端應用程序使用基於ATM的計算數據的報告。 ATM的計算數據的示例可以是:AverageTicketPaperLength,AverageAmount,DeviationAmount,AverageElectricity等等。這些計算數據有很多很多。 計算應該在服務器上進行,而不是在客戶端進行。 如果這些報告定義都已修復,那就不會是一個大問題:我們可以為報告創建單獨的服務/ Poco。 將計算放在業務層中,並根據需要填充Poco。 但客戶端應用程序必須能夠根據ATM的任何計算屬性集進行過濾,並將另一組(計算)屬性作為數據返回。
我可以創建一個具有大約500個計算屬性的Poco,其中每個單獨的報告可能只使用10個屬性。 但是,我們當然不希望每個實體每次都執行500次計算。
所以一般來說,我想知道如何通過例如WCF暴露實體的計算數據。 幾乎所有我看到解釋實體框架,Poco和WCF的例子都只處理實體的持久字段,這非常簡單。
不要通過WCF公開實體,創建一些DTO。
例如:
在wcf層 -
DtoInfoForReport1 GetInfoForReport1(long atmId) { ... call BL here... }
DtoInfoForReport2 GetInfoForReport2(long atmId) { ... call BL here... }
在數據層 -
AtmEntity
{
long Id {get;set;}
... some properties ...
HashSet<Transaction> AtmTransactions {get;set;}
}
轉移物品 -
DtoInfoForReport1
{
long AtmId {get;set;}
XXX SomeCalculatedValue {get;set;}
}
在BL -
DtoInfoForReport1 CreateInfoForReport1(long atmId)
{
var atm = YYY.GetEntity<AtmEntity>(atmId);
return new DtoInfoForReport1
{
AtmId = atmId,
SomeCalculatedValue = DoSomeCalculationOverMyAtmWithItsTransactions(atm),
};
}
希望我的問題是正確的。 否則評論。
根據評論進行編輯:我會建議像這樣的DTO:
[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;}
}
現在如果你的計算值總是加倍,那基本上就完成了。 如果你的值可能是不同的類型,你需要一些基類--DtoParameterCalculatedValueBase,它是這樣的:
[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;}
}
注意KnownType屬性 - 它告訴WCF可以代替基類的類型。 您必須為每個繼承的類型提供此屬性(或使用DataContractResolver,這已經是另一個故事)。
比在WCF中:
DtoRequestedCalculations GetCalculatedValuesForAtm(long atmId, List<long / string/ Guid / XXX> valueIdentifiers);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.