1

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

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

另一个选项是适用于 windows 通用的便携式库。在这种情况下,我无法选择目标项目,这是有道理的,因为它仅适用于通用应用程序。在这种情况下,我可以添加对System.ServiceModel.

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

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

谢谢。

4

1 回答 1

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 或 .NET 4.6 之一。当然,您还将引用两个应用程序中的通用可移植类库,以及每个应用程序中正确的平台特定类库。
于 2016-01-02T12:01:29.830 回答