簡體   English   中英

如何通過WCF公開實體的計算數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM