【发布时间】:2011-03-11 16:37:00
【问题描述】:
所以我有一个分层的应用程序,我在上面添加了一个 WCF 服务接口。该服务只是一个外观,我们所有的业务逻辑都已经存在于业务逻辑层 (BLL) 中的业务对象 (BO) 中,业务逻辑层 (BLL) 是一个类库。在 BLL 中,我们使用构造函数注入将依赖项注入 BO。这一切都适用于良好的单元测试等。关于问题......
通常我会简单地为每个服务方法创建一组请求/响应对象作为 DataContracts,并为操作提供适当的属性。如果操作需要将我们的“实体”之一传入或传出该方法,我只需定义该类型的属性,一切都会好起来的(我们所有的 BO 都是可序列化的)。但是,当这些“实体”之一被传递到服务方法时,WCF 会反序列化该对象,而不会调用我们定义的构造函数,因此,依赖关系不会解析。
让我们使用名为 CreateSomething 的服务方法的例子。我通常会将其定义为具有如下签名的服务操作:
CreateSomethingResponse CreateSomething(CreateSomethingRequest request);
CreateSomethingRequest 将是一个 DataContract 并且在其属性中具有 Something 类型的属性,该属性表示正在传递给服务的“实体”。在这种情况下,Something 是一个业务对象,它期望在实例化时从 DI 容器接收 ISomethingRepository 接口的实例 - 正如我上面所说的那样,它不会当 WCF 反序列化服务器上的对象时发生。
选项 #2 是从 DataContract 中删除 Something 属性,并在我的 DataContract 中明确定义每个属性,然后在我的服务方法中,创建 Something 的新实例strong> 类,让容器注入依赖项,然后将属性值从 DataContract 对象映射到 BO。我当然可以这样做,但我担心现在有两个地方可以进行更改,例如,如果我想向 Something 类型添加一个属性。并且,有很多属性,有很多代码重复。
有没有人跨过这座桥,如果有,您能否分享一下您的想法以及您在自己的应用程序中遇到或将如何处理这种情况?谢谢!!!
【问题讨论】:
标签: wcf dependency-injection datacontract