【问题标题】:How can I add a Singleton class to a reference assembly for NuGet如何将 Singleton 类添加到 NuGet 的引用程序集
【发布时间】:2015-12-22 20:59:00
【问题描述】:

我正在尝试为 Windows UWP 创建一个 NuGet 包,该包是为不同的架构(x86、x64 和 ARM)构建的。根据我打开的 NuGet 错误 - nuget restore always restores for ARM not x86,x64 ,我需要将我的类的“表面积实现”添加到 NuGet 的 ref 文件夹。

我的一个公共类是单例,这意味着它有一个静态方法。如何将静态方法添加到 ref 文件夹的“表面积实现”?我假设ref 文件夹需要包含一个接口,该接口定义了我的 DLL 中实现的公共类和方法。

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

ref 是一个新的可选目录,其中包含 .NET 程序集 定义公共表面(公共类型和方法) 要编译的应用程序。此文件夹中的程序集可能有 没有实现,它们纯粹用于定义表面积 编译器。如果包没有 ref 目录,那么 lib 都是 参考程序集和实现程序集。

【问题讨论】:

    标签: c# nuget nuget-package


    【解决方案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) 被用作参考程序集,他展示了另一种非常相似的方法,即在参考程序集类中使用静态方法并在另一个程序集中使用特定于平台的实现。

    【讨论】:

    • 嗯,这就是难题。由于我的参考程序集不能有任何实现,它必须是接口或抽象类,我不能向接口或抽象类添加静态方法
    • 如果你愿意,你的参考程序集可以有实现。
    • 我被限制在参考库中没有实现,因为我的库不是 AnyCPU - 它们对于 x86、ARM 和 x64 是不同的。
    • 然后您可以按照您的建议进行操作,即将代码转换为使用接口或抽象类。或者您可以保留一个静态方法,但让它使用接口或抽象类,以便在需要时可以使用平台特定的实现。例如,您可以通过静态类注册特定于平台的实现。
    • 马特,谢谢你的回答。当你说“你可以用静态类注册平台特定的实现”时,你能给我举个小例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    相关资源
    最近更新 更多