如何将.NET代码库实现为服务层 - 在多个应用程序之间共享相同的BL / CRUD

时间:2012-11-09 15:28:58

标签: wcf .net-4.0 .net-3.5 wcf-client

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

问题:我目前在CLR程序集中有我的业务逻辑,在我的SQL-Server上可以找到直接在SQL-Server上运行自动ETL的其他CLR程序集。我也在开发一个内部网站点,该站点还需要该业务逻辑程序集中的代码信息,但是在部署和代码维护方面,引用CLR程序集代码一直处于次优状态。另一个部门也表示有兴趣将代码库和数据用于他们自己的内部网站。

问题: 我读了很多问答(123,{{3关于这个主题的问题,但是我发现它非常有用,所以我会尝试提出更具体案例的问题(即单个BL和数据访问代码库) < / p>

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

我只欣赏单个问题的答案,如果你觉得自己知道某事,我会+1帮助我接近一个完整的答案。

1 个答案:

答案 0 :(得分:2)

好的,所以你想在整个企业范围内制作你的代码。当你想要这样做时,有两个基本问题需要讨论,所以我会以这种方式构建答案:

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

WCF的内容

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

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

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

当客户端代码在特定地址调用WCF服务时,使用特定的Binding和特定的Contract(必须与特定地址和特定Binding正在传递的服务器匹配),WCF生成一个代理对象实现合同的界面。

提供服务的程序是任何.NET可执行文件。它必须生成一个或多个WCF主机,这些主机将注册实现服务协定的对象或类,并将每个传递的服务分配给特定的地址和绑定。 (可能很多)

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

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


正确管理您的依赖关系

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

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

最小数量的集会将是4.每个上述演​​员一个,一个指定合同,将由所有三个演员使用。它应包含以下内容:

  • 指定合同的界面。
  • 界面所需的所有类型,当然都是通过网络发送的,因此必须是可序列化的。

它应该没有更多,否则,它将成为维护的噩梦。


回答您的问题

我希望我的回答很清楚。让我们总结一下你问题的答案。

  

WCF服务是我想要的解决方案吗?我所有潜在的服务客户   在同一台服务器上运行,有没有其他方法可以参考   在CLR程序集和网站项目中都有相同的代码库?我不需要   支持不同的平台(例如Java) - 一切都是.NET(yay for   内部程序!) - 是WCF矫枉过正吗?

一切都是矫枉过正的。 WCF非常易于使用,并且可以很好地缩小。

  

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

在现有代码上设置WCF只需要实现一个额外的类,并且一些代码创建将为上述类提供服务的主机。

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

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

  

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

WCF没有处理这个问题。不同的环境,不同的服务地址。你必须自己照顾这个。

  

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

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

  

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

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

  

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

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

  

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

如果你像我在上一节中描述的那样正确地管理你的依赖关系,那么唯一的约束就是&#34;合同&#34;所需的最小CLR版本。组装

  

要完成此任务,我需要知道哪些最小的.NET服务架构编程?我会随着时间的推移更多地了解WCF,但我需要评估架构工作并权衡它完成任务(功能请求)。 MS教程是否为我提供了所需的技能?

您需要这些练习的结果:

  1. 制作两个可以进行通信的可执行文件,一个客户端和一个服务器 通过位于单独DLL中的WCF协定。配置 应该位于app .config文件中。
  2. 制作两个可以进行通信的可执行文件,一个客户端和一个服务器 通过WCF合同 位于单独的DLL中。应以编程方式确定配置。
  3. 尝试将可序列化的类作为参数发送到您的服务。
  4. 尝试发送可序列化的类作为服务的返回值。
  5. 在此之后,您需要考虑分享服务的地址和绑定的最佳/最便宜的方式。

    希望它有所帮助。