【问题标题】:Avoid exposing too many assemblies to client consuming WCF service避免向客户端使用 WCF 服务公开太多程序集
【发布时间】:2011-09-21 18:54:11
【问题描述】:

我需要一些指导。我有一个 WCF 服务,它是一个更大的解决方案的一部分。目前,由于继承问题,最终消费者必须引用太多程序集。例如,这是我的基本项目设置:

MyProject.Domain

namespace MyProject.Domain
{
    public interface IFooable{}

    public class Foo : IFooable{}
}

MyProject.Contracts

namespace MyProject.Contracts
{
    [DataContract]
    public class FooData : IFooable{}

    [ServiceContract]
    public class IFooService
    {
        IEnumerable<FooData> GetFoos();
    }
}

MyProject.Proxies

namespace MyProject.Proxies
{
    public class WCFClient{}
}

问题出在这里:

class ConsumerCode
{
    private WCFClient = new WCFClient();

    void consumeService()
    {
        // Compiler error. No reference to MyProject.Domain.IFooable
        var foos = WCFClient.GetFoos();
    }

这意味着使用 FooData 对象的最终消费者还必须包含对 MyProject.Domain 的引用,这很糟糕,因为我不应该公开WCF 服务的最终客户端的业务逻辑层。

有没有办法解决这个问题?

【问题讨论】:

  • 通过 Contracts.FooData 实现 Domain.IFooable 有什么好处吗?如果您删除此依赖项,则不会公开您的域命名空间对象。

标签: c# wcf web-services assemblies business-logic


【解决方案1】:

它非常简单——在合同中定义 IFooable,而不是在域中。

这里的逻辑是任何暴露给客户端的东西(根据定义)都是合同或合同的一部分,而不是域实体。

【讨论】:

  • 我完全同意你的看法。但是,如果 IFooable 在 Contracts 程序集中没有意义怎么办?例如,我的特殊情况是从 INotifiable 接口继承的 Domain 对象和 Contract 对象,这与通过服务公开的 Contracts 无关。
  • 我猜你是对的。 INotifiable 接口是一项服务(尽管不是 WCF 服务)。我想我只需要考虑一下我的单独程序集的语义定义,然后我就完全相信了。
  • 如果 INotifiable 与合约无关,那么您应该能够从其继承链中删除 INotifiable。
  • 另一种看待它的方式是针对任何 X,如果更改 X 需要重新编译客户端,则 X 是合同的一部分。合同是客户端和服务之间关于将使用哪些数据结构进行通信的协议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多