2016-01-01 46 views
1

我正在測試UWP應用程序,我想使用代理來使用WCF服務。我有一個代理,它是.net 4.6的一個庫,但我不能在通用應用程序的項目中添加此項目作爲參考。這很正常,因爲它是.NET 4.6的一個庫。我無法在便攜庫項目中添加對ServiceModel的引用

所以我想創建一個可移植的庫,我有兩個選項來創建一個可移植的庫。這個選項讓我說我可以使用什麼目標。我選擇.net 4.6和windows universal 10.0。問題是我無法添加對我需要使用代理的System.ServiceModel的引用。

另一種選擇是windows通用便攜庫。在這種情況下,我無法選擇目標項目,因爲它僅適用於通用應用程序,所以它有道理。在這種情況下,我可以添加對System.ServiceModel的引用。

我知道,在一個便攜式庫中,我只能使用目標項目的庫更具限制性,在這種情況下,我想這是Windows通用,沒有.NET 4.6。但是,那麼爲什麼我可以在便攜庫中爲通用應用程序添加引用,而不是在我正在使用.net的便攜庫中添加引用?

我想有一個通用的便攜庫,能夠在WPF應用程序和通用Windows應用程序中使用代理。

謝謝。

回答

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之一)來初始化依賴注入框架。當然,您還將參考兩個應用程序中的通用可移植類庫以及每個應用程序中正確的平臺特定類庫。
相關問題