我有WCF服务方法,它接受一个int参数并返回一个基于该参数的结果集。我正在使用linq和实体框架来检索记录。有一个新要求用另一个字段查询同一个表。该字段是一个varchar字段,并将字符串参数作为输入。那么实现这个的最佳方法是什么。扩展相同的服务方法以合并新参数或者制作单独的服务方法是否更好?另一点需要注意的是,我不知道客户在任何给定的时间点会传递哪个参数。以下是现有的服务方法逻辑
public IEnumerable<TBI.JV.Business.Objects.Asset> GetAssetsBasicBySedols(int[] sedols)
{
var priceDate = DateTime.UtcNow.Date.AddMonths(-8);
var typeList = new string[]
{
"UNIT TRUST",
"OEIC",
"INVESTMENT TRUST",
"INVESTMENT COMPANY",
"PENSION FUND",
"INSURANCE BOND",
"LISTED EQUITY",
"PREFERENCE SHARE",
"ZERO DIVIDEND PREF",
"GILT (CONVENTIONAL)",
"GILT (INDEX LINKED)",
"AIM",
"VCT",
"OFFSHORE FUND",
"ETP"
};
using (var dealingContext = new dbDealingContainer())
{
return (from fundprice in dealingContext.FundPrices
where (fundprice.FUND_STATUS == "ACTIVE" || fundprice.FUND_STATUS == "SUSPENDED") &&
(fundprice.INVNAME != null || fundprice.INVNAME != "") &&
!fundprice.INVNAME.StartsWith("IFSL Bestinvest") &&
fundprice.WaterlooTradable == true &&
//fundprice.PRICE_DATE > priceDate &&
fundprice.BID_MID_PRICE > 0 && typeList.Contains(fundprice.FUND_TYPE)
&& ((sedols.Count() > 0 && sedols.Contains(fundprice.Id)) || sedols.Count() == 0)
select new TBI.JV.Business.Objects.Asset
{
AssetName = fundprice.INVNAME,
AssetId = fundprice.Id,
AssetType = fundprice.FUND_TYPE,
Epic = fundprice.INVESTMENT_CODENAME,
StarRating = fundprice.STARLEN,
Sedol = fundprice.SEDOL_NUMBER
}).ToList();
}
}
答案 0 :(得分:3)
简而言之,您需要使用此新参数添加服务方法。
在 S 服务 O 面向 A 架构中,修改(因此删除)被认为是一个重大变化,而添加是透明的客户端。
当您更改服务方面时,您必须问自己使用您的应用程序的实际客户会发生什么。如果答案是“他们将不得不更新他们的客户”,这通常不是一件好事。
从另一个角度来看,新功能意味着新概念,不应改变现有概念。
此外,即使您计划替换现有功能,也不应该一步到位。您应该考虑上升兼容性:使用新修改的功能运送服务,将旧服务标记为过时,通知您的客户并在以后的最终版本中发送服务。
这背后的整个概念称为SOA Governance。