gpt4 book ai didi

c# - 如何通过 WCF 公开实体的计算数据

转载 作者:太空狗 更新时间:2023-10-29 20:21:04 24 4
gpt4 key购买 nike

我们正在客户端(表示层)和服务器(数据/业务层)之间使用 WCF 开发一个 N 层架构应用程序。老实说,我找不到任何关于如何通过 WCF 有效公开计算数据的真实示例/信息。

为了描述我的问题,假设我们有 ATM 机,其中有很多交易。所以我们在 ATM 类和交易类之间存在 1-N 关系。 ATM 类具有 Location、ModelNo、Description、InstallDate 等属性,交易记录具有 Amount、DateTime、CustomerInfo、TicketPaperLength、ElectricityUsed 等信息

通过 WCF 公开这些类不是问题。问题是我们有很多基于底层交易表的 ATM 计算字段。例如,客户端应用程序使用基于 ATM 计算数据的报告。 ATM 的计算数据示例可以是:AverageTicketPaperLength、AverageAmount、DeviationAmount、AverageElectricity 等。这些计算数据有很多很多。计算应该发生在服务器端而不是客户端。如果这些报告定义都是固定的,那就不是什么大问题了:我们可以为报告创建单独的服务/Poco。将计算放在业务层中,并根据需要填充 Poco。但是客户端应用程序必须能够根据 ATM 的任何一组计算属性过滤报告,并将另一组(计算的)属性作为数据返回。

我可以创建一个包含大约 500 个计算属性的 Poco,其中每个报告只能使用 10 个属性。但是,我们当然不希望每次都为每个实体执行所有 500 次计算。

所以总的来说,我想知道如何通过例如公开一个实体的计算数据。 WCF。我看到的几乎所有解释 Entity Framework、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);

关于c# - 如何通过 WCF 公开实体的计算数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13951453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com