3

设置:我正在为我的部门开发一个 Intranet 工具集,其主要目的是集中管理数据质量和可访问性,同时还可以自动化和扩展一些部分流程。

问题:我目前在 CLR 程序集中有我的业务逻辑,它在我的 SQL-Server 上可用于其他直接在 SQL-Server 上运行自动 ETL 的 CLR 程序集。我还在开发一个 Intranet 站点,该站点也需要该业务逻辑程序集中的代码信息,但在部署和代码维护方面,引用 CLR 程序集代码的效果并不理想。另一个部门也表示有兴趣将代码库和数据用于他们自己的 Intranet 站点。

问题:我已经阅读了 很多关于这个主题的问答(1、2、3、4 ... 但我发现它非常包含,所以我会尝试提问更具体的案例(即单个 BL 和数据访问代码库)

  • WCF 服务是我想要的解决方案吗?我所有潜在的服务客户端都在同一台服务器上运行,是否有另一种方法可以在 CLR 程序集和网站项目中引用相同的代码库?我不需要对不同平台(例如 Java)的支持——一切都是 .NET(对内部程序来说是的!)——WCF 是否矫枉过正?
  • WCF 服务中的代码可以像类库一样使用,还是我需要编写一种新的方式来访问服务中的类/方法?
  • 开发、测试和生产实例的分离?
    • 客户端访问 WCF 服务时是否可以更新它,或者我是否需要安排维护时段?当我更新服务时,我是否也需要以某种方式更新客户端?
    • 我是否可以动态设置服务引用,就像我目前动态设置数据库连接字符串一样,取决于 StageConfig = dev、test 还是 prod?
  • 我的 CLR 程序集是为 .Net 3.5 编写的,但是为 .NET 4.0 编写的网站会造成问题吗?
  • 我需要知道哪些最少的 .NET 服务架构编程才能完成此任务?随着时间的推移,我将了解更多关于 WCF 的信息,但我需要评估架构工作并将其与完成任务(功能请求)进行权衡。MS 教程能让我获得所需的技能吗?

我很感激只回答单个问题,如果你觉得你知道一些事情,我会 +1 任何帮助我更接近完整答案的东西。

4

1 回答 1

2

好的,所以你想让你的代码在企业范围内。当你想这样做时,有两个基本问题要讨论,所以我将这样构建答案:

  • 您必须了解 WCF 的全部内容。
  • 您必须正确管理您的依赖关系。

WCF 是关于什么的

WCF 是一种执行 RPC/RMI(远程过程调用/远程方法调用)的方式,这意味着一些客户端代码可以通过网络调用位于其他地方的代码。

可调用的 WCF 服务由 ABC 三元组确定:

  • 服务规范实现为具有“ServiceContract”属性的 .NET 接口。这是合同(“C”)
  • 服务的“位置”由一对确定:地址(“A”)和绑定(“B”)。Binding 确定用于客户端和服务器之间通信的协议套件(NetPipe、TCP、HTTP,...)。Address 是遵循由 Binding 确定的方案的 URI ("net.pipe", "net.tcp", "http", ...)

当客户端代码在特定地址调用 WCF 服务时,具有特定的 Binding 和特定的 Contract(必须与特定地址和特定 Binding 的服务器正在交付的内容相匹配),WCF 生成一个代理对象,实现合同。

提供服务的程序是任何 .NET 可执行文件。它必须生成一个或多个 WCF 主机,这些主机将注册实现服务契约的对象或类,并将每个交付的服务与特定的地址和绑定相关联。(可能很多)

可以通过 app .config 文件进行配置,您将在其中指定 ABC 三元组并将这些三元组与您将在应用程序中使用的名称相关联。您也可以以编程方式进行,这非常容易。

WCF 不能解决您部署应用程序或地址和绑定配置的问题。它只是解决了让两个可执行文件与强类型对象(通过特定接口)相互通信的问题。共享服务配置由您决定。您可以在 Windows 共享上使用共享的 .config 文件,甚至设置一个 LDAP 服务器,该服务器将提供查找服务所需的所有数据(即 A 和 B)。


正确管理依赖项

在您的场景中,有三个参与者想要使用您的 WCF 基础结构:

  • 您的 SQLCLR 程序集,它将成为客户端。
  • Intranet 站点,它将是另一个客户端。
  • 服务主机,它将是一个服务器。

最低限度的集会数量为 4 个。每个上述参与者一个,一个指定合同,所有三个参与者都将使用该合同。它应该包含以下内容:

  • 指定合约的接口。
  • 接口所需的所有类型,当然会通过网络发送,因此必须是可序列化的。

里面不应该有更多的东西,否则,这将是一场维护噩梦。


回答您的问题

我希望我的回答是明确的。让我们总结一下您的问题的答案。

WCF 服务是我想要的解决方案吗?我所有潜在的服务客户端都在同一台服务器上运行,是否有另一种方法可以在 CLR 程序集和网站项目中引用相同的代码库?我不需要对不同平台(例如 Java)的支持——一切都是 .NET(对内部程序来说是的!)——WCF 是否矫枉过正?

一切都是多余的。WCF 相当容易使用并且可以很好地缩减。

WCF 服务中的代码可以像类库一样使用,还是我需要编写一种新的方式来访问服务中的类/方法?

在现有代码上设置 WCF 只需要实现一个附加类,以及一些创建将服务于上述类的主机的代码。

调用 WCF 服务需要创建一个 Channel,它是一个实现接口的 .NET(代理)对象。

所以基本上,您的业务代码保持在相同的状态。

开发、测试和生产实例的分离?

WCF 不会处理这个问题。不同的环境,不同的服务地址。你必须自己解决这个问题。

客户端访问 WCF 服务时是否可以更新它,或者我是否需要安排维护时段?

这取决于您的维护策略。杀死服务进程并启动新版本是基本的升级机制。

当我更新服务时,我是否也需要以某种方式更新客户端?

如果您像我在上一节中概述的那样正确管理您的依赖项,则只有在服务规范(接口)发生更改时才需要更新客户端。

我是否可以动态设置服务引用,就像我目前动态设置数据库连接字符串一样,取决于 StageConfig = dev、test 还是 prod?

您必须管理它,可能通过以编程方式为服务设置地址和绑定。

我的 CLR 程序集是为 .Net 3.5 编写的,但是为 .NET 4.0 编写的网站会造成问题吗?

如果您像我在上一节中概述的那样正确管理您的依赖项,唯一的约束将是“合同”程序集所需的最低 CLR 版本。

我需要知道哪些最少的 .NET 服务架构编程才能完成此任务?随着时间的推移,我将了解更多关于 WCF 的信息,但我需要评估架构工作并将其与完成任务(功能请求)进行权衡。MS 教程能让我获得所需的技能吗?

您将需要这些练习的结果:

  1. 制作两个可执行文件,一个客户端和一个服务器,它们将通过位于单独 DLL 中的 WCF 合同进行通信。配置应位于 app .config 文件中。
  2. 制作两个可执行文件,一个客户端和一个服务器,它们将通过位于单独 DLL 中的 WCF 合同进行通信。配置应以编程方式确定。
  3. 尝试将可序列化的类作为参数发送到您的服务。
  4. 尝试发送一个可序列化的类作为服务的返回值。

之后,您需要考虑共享服务的地址和绑定的最佳/最便宜的方式。

希望能帮助到你。

于 2013-05-16T11:16:49.923 回答