我有一个与WCF服务通信的项目来访问数据。有时服务器是本地的,然后它使用sql存储过程直接查询数据库。
要解释一下,假设我有以下方法:
Asset GetAsset(int AssetID);
此方法由WCF服务公开或在直接查询数据库时在本地使用。我遇到的问题是WCF服务的公开方法的Asset对象与本地方法不同。即 暴露的服务方法是:
WcfService.Asset GetAsset(int AssetID);
直接数据库查询方法是:
LocalNamespace.Asset GetAsset(int AssetID);
虽然我可以,但我不想让Direct DB查询方法使用WcfService Asset对象,因为我希望能够在需要时删除WcfService。理想情况下,我想将公共对象/接口捆绑在一个单独的程序集中,我可以在本地和服务上使用它。
我有任何选择吗?也许我对Referenced Assemblies选项知之甚少,尽管它已经开启。
答案 0 :(得分:2)
你绝对可以做到这一点,这是WCF的强大优势之一。创建一个单独的程序集,其中包含[DataContract]
类,[ServiceContract]
接口,而不包含任何其他内容。然后,您可以在WCF服务,WCF客户端或WCF外部使用它。添加服务引用时使用“引用的程序集”选项以确保使用合同程序集。
你可以做得更好。将服务合同实现类移动到另一个单独的程序集中。然后,您可以直接在进程中调用它们,而无需通过服务调用。这会将您的WCF服务项目减少为.svc
个文件和web.config
。
答案 1 :(得分:1)
在(添加服务引用)对话框中,按(高级...)按钮,然后选中(使用引用程序集中的类型),这将解决问题,但是您应该将共享类放在单独的程序集中,并引用它同时适用于客户和服务。
答案 2 :(得分:1)
创建一个Data Access Layer
(DAL)对象,可能在一个单独的项目中。
使用它来处理所有调用,而不是通过反射或任何其他方式访问x
程序集,如前所述,在WCF和本地项目中添加对象的引用。您可以在此访问层中使用任何内容,例如Entity Framework
或NHibernate
。使用DAL
对象调用转到数据库的方法。
Public Class ServiceDAL
{
public Asset GetAsset(int id)
{
//Get your asset
return asset;
}
}