2015-12-21 53 views
1

我正在嘗試爲不同的體系結構(x86,x64和ARM)構建的Windows UWP創建NuGet程序包。根據我打開的NuGet錯誤 - nuget restore always restores for ARM not x86,x64,我需要將我的類的「表面區域實現」添加到NuGet的ref文件夾中。如何添加Singleton類到NuGet的引用程序集

我的一個公共類是單例,意味着它有一個靜態方法。如何將靜態方法添加到ref文件夾的「表面區域實現」中?我假設ref文件夾需要包含一個接口,用於定義我的DLL中實現的公共類和方法。

https://docs.nuget.org/create/uwp-create

裁判是一個新的,可選的,目錄包含限定所述公共表面(公共類型和方法)用於 應用進行編譯.NET組件 。該文件夾中的程序集可能沒有實現,它們純粹用於定義 編譯器的表面區域。如果軟件包沒有ref目錄,那麼lib就是 引用程序集和實現程序集。

回答

1

如果您的API需要靜態方法,那麼只需將靜態方法添加到您的引用程序集中即可。

引用程序集可能沒有實現,所以它只是定義類型,或者它可能包含實現邏輯。

如果您需要特定於平臺的邏輯,並且仍然希望在您的參考裝配中使用靜態實現,那麼這是可能的。一個例子是PCLStorage NuGet package。這有一個靜態FileSystem類,它有一個名爲Current的靜態屬性。

public static class FileSystem 
{ 
    static Lazy<IFileSystem> _fileSystem = new Lazy<IFileSystem>(() => CreateFileSystem(), System.Threading.LazyThreadSafetyMode.PublicationOnly); 

    public static IFileSystem Current 
    { 
     get 
     { 
      IFileSystem ret = _fileSystem.Value; 
      if (ret == null) 
      { 
       throw new NotImplementedException(); 
      } 
      return ret; 
     } 
    } 

    static IFileSystem CreateFileSystem() 
    { 
     return null; 
    } 
} 

所以大家參考組件可以定義一個靜態類和靜態屬性,甚至是一個靜態方法,它沒有實現。 PCLStorage的FileSystem類在其引用程序集中具有私有靜態CreateFileSystem方法:

然後,在您的平臺特定程序集中,您的CreateFileSystem創建自己的類,該類實現IFileSystem接口。在你的情況下,靜態方法可以是公開的而不是私有的。

的PCLStorage項目採用有條件地定義代碼來創建不同的特定平臺和參考組件:

static IFileSystem CreateFileSystem() 
    { 
#if NETFX_CORE || WINDOWS_PHONE 
     return new WinRTFileSystem(); 
#elif SILVERLIGHT 
     return new IsoStoreFileSystem(); 
#elif FILE_SYSTEM 
     return new DesktopFileSystem(); 
#else 
     return null; 
#endif 
    } 

這一切工作,如果所有的名字和你的組件的版本是所有平臺一樣的,包括參考組件。這是Paul Betts在Bait and Switch PCL trick的帖子中討論的bait and switch trick。在Paul Betts的例子中,一個可移植類庫(PCL)被用作一個引用程序集,他展示了另一種非常類似的方法來在引用程序集類中使用靜態方法,並在另一個程序集中使用特定於平臺的實現。

+0

那麼,這是難題。由於我的引用程序集不能有任何實現,它必須是一個接口或抽象類,我不能將一個靜態方法添加到接口或抽象類 – Srik

+0

如果需要,您的引用程序集可以有實現。 –

+0

我被限制在參考庫中沒有實現,因爲我的庫不是AnyCPU - 它們對於x86,ARM和x64是不同的。 – Srik

相關問題