1

我有一个与 WCF 服务通信以访问数据的项目。有时服务器是本地的,然后它使用 sql 存储过程直接查询数据库。

为了解释,假设我有以下方法:

Asset GetAsset(int AssetID);

此方法要么由 WCF 服务公开,要么在直接查询数据库时在本地使用。我遇到的问题是 WCF 服务的公开方法的 Asset 对象与本地方法不同。即暴露的服务方法是:

WcfService.Asset GetAsset(int AssetID);

直接DB查询方法是:

LocalNamespace.Asset GetAsset(int AssetID);

虽然可以,但我不想让 Direct DB 查询方法使用 WcfService Asset 对象,因为我希望能够在需要时删除 WcfService。理想情况下,我想将公共对象/接口捆绑在一个单独的程序集中,我可以在本地和服务上使用它。

我还有选择吗?也许我对 Referenced Assemblies 选项知之甚少,尽管它已打开。

4

3 回答 3

2

你绝对可以做到,这是 WCF 的一大优势。创建一个单独的程序集,其中包含您的[DataContract]类、[ServiceContract]接口,仅此而已。然后,您可以在 WCF 服务、WCF 客户端或完全在 WCF 之外随意使用它。在添加服务引用时使用 Referenced Assemblies 选项,以确保使用您的合同程序集。

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

于 2012-12-20T09:15:26.630 回答
1

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

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

Public Class ServiceDAL
{
  public Asset GetAsset(int id)
  {
    //Get your asset
    return asset;
  }
}
于 2012-12-20T09:33:57.720 回答
1

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

于 2012-12-20T09:17:51.367 回答