我正在构建 C# Web 应用程序。我的 Web 应用程序可以部署在 Azure 和 AWS 上。
挑战就像我的应用程序需要 Blob 存储(例如 Azure Blob 和 AWS S3)。
现在我正在使用存储库模式,并且添加了 Azure SDK 和 AWS SDK。
但要求是构建 2 个镜像,以便 Azure 镜像应具有 Azure SDK,而 AWS 镜像应仅具有 AWS SDK。
有什么具体的方法来解决这种情况吗?
在 C++ 中,我们有编译器标志,以便我们可以跳过编译中的某些代码部分。将代码编译为 IL 时,C# 中是否有可用的此类选项。
注意:如果是,那么我将使用 2 个标志,以便为 Azure 构建一个代码,为 AWS 构建另一个代码。
最佳答案
您可以通过定义自定义常量来做到这一点,请参阅 msbuild, defining Conditional Compilation Symbols以及其他。
创建三个类库:
YourLib.Abstractions
:存储接口(interface)YourLib.AWS
:AWS 实现YourLib.Azure
:Azure 的实现
然后您的主应用程序在 .csproj 中有条件地包含引用:
<ItemGroup>
<ProjectReference Include="../YourLib.Abstractions/YourLib.Abstractions.csproj" />
</ItemGroup>
<ItemGroup Condition="$(DefineConstants.Contains('AWS_BLOBS'))">
<ProjectReference Include="../YourLib.AWS/YourLib.AWS.csproj" />
</ItemGroup>
<ItemGroup Condition="$(DefineConstants.Contains('AZURE_BLOBS'))">
<ProjectReference Include="../YourLib.Azure/YourLib.Azure.csproj" />
</ItemGroup>
并在您的代码中调用适当的依赖项注入(inject)逻辑:
#if AWS_BLOBS
services.AddAwsBlobs();
#endif
#if AZURE_BLOBS
services.AddAzureBlobs();
#endif
然后编译时:
dotnet build /p:DefineConstants="AWS_BLOBS"
您还可以创建解决方案级构建配置(“调试:AWS”、“调试:Azure”)并在其中定义常量。
关于c# - 构建一个 C# 应用程序,使其根据运行的云使用 s3 或 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75664423/