在WCF服务和客户端中使用程序集中的接口和类

时间:2012-12-20 09:10:16

标签: c# wcf

我有一个与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选项知之甚少,尽管它已经开启。

3 个答案:

答案 0 :(得分:2)

你绝对可以做到这一点,这是WCF的强大优势之一。创建一个单独的程序集,其中包含[DataContract]类,[ServiceContract]接口,而不包含任何其他内容。然后,您可以在WCF服务,WCF客户端或WCF外部使用它。添加服务引用时使用“引用的程序集”选项以确保使用合同程序集。

你可以做得更好。将服务合同实现类移动到另一个单独的程序集中。然后,您可以直接在进程中调用它们,而无需通过服务调用。这会将您的WCF服务项目减少为.svc个文件和web.config

的集合

答案 1 :(得分:1)

在(添加服务引用)对话框中,按(高级...)按钮,然后选中(使用引用程序集中的类型),这将解决问题,但是您应该将共享类放在单独的程序集中,并引用它同时适用于客户和服务。

答案 2 :(得分:1)

创建一个Data Access Layer(DAL)对象,可能在一个单独的项目中。

使用它来处理所有调用,而不是通过反射或任何其他方式访问x程序集,如前所述,在WCF和本地项目中添加对象的引用。您可以在此访问层中使用任何内容,例如Entity FrameworkNHibernate。使用DAL对象调用转到数据库的方法。

Public Class ServiceDAL
{
  public Asset GetAsset(int id)
  {
    //Get your asset
    return asset;
  }
}