我正在开发基于WCF的Web服务项目。我们有50种不同的服务,提供获取,创建,更新和删除操作。我的问题是当我在操作中发现错误时,让我们说在获取操作中,这在所有服务上都很常见,我需要打开并替换所有50个服务中的所有代码。我的问题是,有没有办法实现一个单核心代码模板,所以我所做的任何更改都将被所有服务使用?基本上我看起来像ASP.NET中的母版页概念。让我举一个想象的例子来更好地说明我的问题;
public string Get(Parameter param)
{
ArrayList myList = new ArrayList();
//some service specific business rules implemented here
return myList.ToString();
}
假设上面的代码正被所有服务使用,我想将我的ArrayList对象更改为List对象,如下所示:
public string Get(Parameter param)
{
List<string> myList = new List<string>();
//some service specific business rules implemented here
return myList.ToString();
}
所以,现在,如果我想通过在每个服务中打开相应的代码文件然后替换代码来实现它,我需要更改所有服务。我正在考虑使用我们现在已经使用的接口,但我想不出以这种方式实现接口的方法。如果有的话,你有什么例子吗?或者还有其他方法来解决这个问题吗?我提前感谢任何帮助。感谢。
答案 0 :(得分:1)
您确实应该将每个Web服务的内部逻辑提取为可重用且无依赖的通用组件,并将Web服务操作保留为只调用此逻辑的存根,例如:
//Convert:
public string Get(Parameter param)
{
List<string> myList = new List<string>();
//some service specific business rules implemented here
return myList.ToString();
}
//Into:
public string Get(Parameter param)
{
var serviceFor = new ModelService<MyModel>();
return serviceFor.ExecuteGet(param);
}
答案 1 :(得分:0)
如果没有更多的例子,很难说,但是你可以将公共部分转移到抽象类吗?例如:
interface IMyService
{
string Get(Parameter param); // common stuff
void GetInternal(Parameter param); // implementation specific stuff
}
abstract class MyServiceBase : IMyService
{
public string Get(Parameter param)
{
List<string> myList = new List<string>();
GetInternal(param); // do service specific stuff
return myList.ToString();
}
}
class MyService1 : MyServiceBase
{
public GetInternal(Parameter param)
{
// service specific stuff
}
}
选项2:
您是否可以使用T4模板或其他东西为每项服务生成bilerplate代码?
答案 2 :(得分:0)
我们有WCF服务和asmx Web服务共享代码,方法是将所有实现代码放入一个类中,然后每个服务实例化该类并调用我们想要的方法:
private ServiceImplementation _implementation = new ServiceImplementation();
public string Get(Parameter param)
{
List<string> myList = new List<string>();
//some service specific business rules implemented here
return implementation.Get(param);
}
这样,我们所有的实现代码都在一个地方。
答案 3 :(得分:0)
通常我将Services实现用作一个非常薄的层,只是一种控制器类。如果我可以避免它,我几乎不把逻辑放入课堂本身。你的例子就是这种情况。确保您的服务实现仅控制服务逻辑的基本流程,并使用“worker”类来执行逻辑本身。这样,您可以在必要时重用/共享逻辑。这也有助于使代码更具可读性。
我希望这会有所帮助。