代码之家  ›  专栏  ›  技术社区  ›  Saajid Ismail

工厂,或者WCF中对象实例化的依赖注入,当对接口进行编码时?

  •  1
  • Saajid Ismail  · 技术社区  · 17 年前

    我正在编写一个客户机/服务器应用程序,其中客户机是一个Windows窗体应用程序,服务器是一个托管在Windows服务中的WCF服务。请注意,我控制应用程序的两侧。

    我现在面临的设计问题是:在客户机上,如何创建对象的新实例,例如。 ICustomer ,如果客户不知道 Customer 具体实施?我需要创建一个新客户保存到数据库。

    我是使用依赖注入还是工厂类来实例化新对象,还是只允许客户机创建具体实现的新实例?

    我不做TDD,我通常只有一个实现 或任何其他暴露的接口。

    4 回复  |  直到 17 年前
        1
  •  1
  •   Zach Bonham    17 年前

    我们已经讨论过在企业应用程序内部这样做,在企业应用程序中,我们控制应用程序的两个方面,以提高.NET客户端的生产率。这件事还没有定论。

    但是,当讨论在共享库中(在客户机和服务之间)拥有契约时,通常包括 二者都 服务 合同([服务合同]),以及 实体 ([DataContract]),用于服务操作的任何参数。这些类型传统上是 混凝土

    在您的例子中,DTO实现了一个接口,比如iccustomer,实现了表示客户的属性,并且是一个[DataContract]。假设类型将正确地序列化到服务(使用NetDataContractSerializer),那么我认为客户机几乎可以推送他们想要的任何具体实现—服务只对符合ICustomer的内容感兴趣。

    . 例如

    public class OrderingCustomer : ICustomer
    {
    }
    

    我不确定你的目标能否实现零客户影响。如果您更改接口类型(将属性添加到ICustomer),您的客户机将需要重新编译。如果您添加一个参数,即使是核心.NET类型的参数(例如int),您的客户机也需要重新编译。这实际上与客户端更新其服务引用和重新编译的影响相同。

    但是,如果 更改服务实现或行为(例如bug修复),然后 案例(共享类型或服务引用)只要你和你的客户之间的合同不变,客户就不需要做任何事情。当然,我也很想听听你的经验,证明这是错误的!

    这种做法也会完全扼杀您与非.NET系统的互操作性。当然,当我把这件事掩盖起来的时候,某个地方的某个部门会听说你的超级spiffy服务并想使用它……他们会运行一些Java堆栈,或者COBOL,或者FORTRAN……等等:)

        2
  •  1
  •   Aaron    16 年前

    我在我的WCF开发中遇到了同样的问题。事实是 双方都必须有一个数据契约的具体实现 沟通的方式。那么这些实现从何而来?在服务器端,实现通常是您的业务对象及其所有业务逻辑等等。您不想在客户机上使用这些实现——这意味着将它们放在共享程序集中,您不想这样做有几个原因。因此客户机需要自己的、单独的一组具体类。要么你自己写,要么自动生成。

    这两种方法都为您提供了针对接口进行编码的好处:只要接口不变,就可以独立地修改和重建服务器和客户机。在一种情况下,接口是WSDL,而在另一种情况下,接口是CLR接口,但是由于WCF基于CLR接口生成WSDL,所以它们实际上是一个相同的接口。就我个人而言,我喜欢添加服务引用,因为它已经存在了,并且不会向我的项目添加任何依赖项,但是可以选择您更喜欢的。

        3
  •  0
  •   marc_s MisterSmith    17 年前

    嗯,我觉得你把两件事搞混了:

    • 你的 将只描述服务公开的功能,例如 FindCustomer AddCustomer -对于这些操作,您的客户机只需要知道接口,当您添加客户机代理(通过使用“add Service Reference”)时,您还将获得 YourServiceClient 实现这些调用的客户端代理中的具体类

    • 这个 数据合同 Customer , Invoice 在客户端 对于这些数据。那些是 与服务器使用的类完全相同-它们看起来相同,并且它们的主要要求是它们序列化为XML并从XML反序列化相同-但是它们实际上是不同的类(很可能是不同的.NET命名空间)。

    你的服务客户 类)。客户 不依赖于

    另一方面,正在交换的数据(默认情况下序列化为XML格式)将始终是从WSDL/XSD推断出的具体类(没有接口),同样,客户机不依赖于服务器的类,只依赖于它们的“XML序列化指纹”。

    推荐文章