我无法在可移植的库项目中添加对ServiceModel的引用

时间:2016-01-01 19:02:26

标签: wcf uwp portable-class-library service-model

我测试了一个UWP应用程序,我想使用代理来使用WCF服务。我有一个代理,它是.net 4.6的库,但我无法在通用应用程序的项目中添加此项目作为参考。这是正常的,因为它是.net 4.6的库。

所以我正在尝试创建一个可移植的库,我有两个选项来创建一个可移植的库。这个选项让我说出我可以使用哪些目标。我选择.net 4.6和windows universal 10.0。问题是我无法添加对我需要使用代理的System.ServiceModel的引用。

另一个选项是用于Windows通用的可移植库。在这种情况下,我无法选择目标项目,它有意义,因为它仅适用于通用应用程序。在这种情况下,我可以添加对System.ServiceModel

的引用

我知道在一个可移植的库中我只能使用目标项目的库更具限制性,在这种情况下我猜这是windows通用的,没有.net 4.6。但是,为什么我可以在便携式库中为通用应用程序添加引用,而不是在我使用的可移植库中添加.net?

我希望有一个通用的可移植库,以便能够在WPF应用程序和通用Windows应用程序中使用代理。

感谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,不同的目标框架之间没有简单的子集关系;即在您的情况下,UWP不是.NET 4.6的子集,因此当您创建一个同时针对两者的可移植类库时,您不仅可以使用较小的框架中的所有API。

在处理客户端System.ServiceModel代码时,情况更加令人困惑:尽管两个目标平台都包含对WCF代理的基本支持,但API的不同之处在于,创建PCL时没有可用的便携式等价物。这就是您所看到的行为的原因:您可以在.NET 4.6类库和UWP类库中创建代理,但是您无法在针对它们的可移植类库中创建代理。您需要创建2个独立的库。

如果你只是从平台特定的WPF调用UWP代码代理,那么这不应该是一个问题,但我怀疑你想从业务逻辑代码中调用它们,你会喜欢在便携式类库中实现。

您可以按如下方式实现:

  • 在UWP和.NET 4.6的公共可移植类库中为代理类创建接口。
  • 从两个平台特定的类库中引用此公共库:UWP和.NET 4.6。这两个库中的代理应该实现通用的可移植接口。我没有尝试过,但是如果您将服务引用配置为重用可移植类库中的类型,则生成的代理应该已经实现了您的接口。这样,您就可以避免在每个特定于平台的类库中围绕代理创建包装器。
  • 您现在可以在公共可移植类库中编写业务逻辑,并且只能使用公共接口与代理一起工作。要在每个平台上获取此接口的具体实例,请使用可移植依赖项注入框架,例如Ninject
  • 在每个平台的应用程序代码中,您将通过注册接口的正确代理实现(UWP one或.NET 4.6 one)初始化依赖项注入框架。当然,您还将从两个应用程序中引用通用的可移植类库,以及每个应用程序中正确的平台特定类库。