小编Nei*_*len的帖子

.Net Core 3.0中IMvcBuilder AddJsonOptions放在哪里?

我刚刚将我的ASP Web API项目从.Net core 2.0升级到3.0。我在用

     services.AddMvc()
             .AddJsonOptions(options =>options.SerializerSettings.ContractResolver 
                                       = new DefaultContractResolver());
Run Code Online (Sandbox Code Playgroud)

以前是为了确保序列化JSON的小写字母。

升级到3.0后,出现此错误...

错误CS1061'IMvcBuilder'不包含'AddJsonOptions'的定义,找不到可以接受的扩展方法'AddJsonOptions'接受类型为'IMvcBuilder'的第一个参数(是否缺少using指令或程序集引用?)

根据Asp.Net Core 2.2中MvcJsonOptions的AddJsonOptions,Microsoft.AspNetCore.Mvc.Formatters.Json nuget包提供了AddJsonOptions扩展方法。我尝试安装/重新安装此程序,但仍然无法解决该方法。有趣的是,智能感知仅显示Microsoft.AspNetCore.Mvc.Formatters。即使我添加了Json nuget包,当我尝试添加using语句时也使用Xml

有什么想法吗?该文档AddJsonOptions只上升到.NET 2.2所以也许是方法已经在3.0赞成一些其他配置机制的被弃用?

asp.net json.net asp.net-core asp.net-core-3.0

35
推荐指数
5
解决办法
1万
查看次数

跨API传递不可变集合的最佳模式是什么

在不可变性之前,IEnumerable是许多API中的首选接口,因为它具有API对传递对象的实际类型不敏感的优点.

public void DoSomeEnumerationsWithACollection(IEnumerable<Thing> collectionOfThings)
{ 
   foreach (var thing in collectionOfThings) doSomethingWith(thing);
   foreach (var thing in collectionOfThings) doSomethingElseWith(thing);
}
Run Code Online (Sandbox Code Playgroud)

当然,至少有两个缺点:

  1. API背后的代码不能依赖collectionOfThings的不变性,可能会遇到"集合修改"异常或遇到其他其他微妙问题.

  2. 我们不知道collectionOfThings是真实集合还是简单的延迟查询.如果我们假设它是一个真正的集合,那么我们就不会通过运行多个枚举来降低性能.如果我们假设它是一个延迟查询并且它实际上是一个真实的集合,那么将其转换为本地列表或其他冻结集合会产生不必要的成本,尽管它确实有助于保护我们免受第一个问题的影响(执行"ToList"操作时仍存在竞争条件).显然,我们可以编写少量代码来检查这一点,并尝试做"正确的事情",但这是令人讨厌的额外混乱.

我必须承认,除了使用命名约定之外,我从未找到过令人满意的模式来解决这个问题.尽管存在缺点,但是实用的方法似乎是IEnumerable是传递集合的最低摩擦方法.

现在,随着不可变的收藏,情况得到了很大改善......

public void DoSomeEnumerationsWithACollection(ImmutableList<Thing> collectionOfThings)
{ 
Run Code Online (Sandbox Code Playgroud)

不再存在收集修改的风险,并且对多个枚举的性能影响没有任何歧义.

但是,我们显然失去了API的灵活性,因为我们现在必须传入一个ImmutableList.如果我们的客户端有其他类型的可枚举不可变集合,则必须将其复制到ImmutableList中才能被使用,即使我们想要做的只是枚举它.

理想情况下,我们可以使用类似的界面

public void DoSomeEnumerationsWithACollection(IImmutableEnumerable<Thing> collectionOfThings)
Run Code Online (Sandbox Code Playgroud)

但是,当然,除了约定之外,接口不能强制执行不可变性等语义.

使用基类可能会起作用

public void DoSomeEnumerationsWithACollection(ImmutableEnumerableBase<Thing> collectionOfThings)
Run Code Online (Sandbox Code Playgroud)

除了它被认为是创建未密封的不可变类的不良形式,以免子类引入可变性.无论如何,这还没有在BCL中完成.

或者我们可以继续在API中使用IEnumerable并使用命名约定来明确我们的代码依赖于传递的不可变集合.

所以...我的问题是在传递不可变集合时哪些模式被认为是最好的?是ImmutableList "新的IEnumerable "一旦我们开始使用不可变性,或是否有更好的办法?

更新

IReadOnlyCollection(由Yuval Itzchakov建议)是对IEnumerable的明显改进,但仍然没有完全保护消费者免受集合中不受控制的变化的影响.值得注意的是,Roslyn代码库大量使用不变性(主要通过ImmutableArray)并且在将这些传递给其他方法时似乎使用显式类型,尽管有几个位置将ImmutableList传递给接受IEnumerable的方法.

.net c# immutability immutablelist immutable-collections

12
推荐指数
2
解决办法
822
查看次数

为什么ReactiveUI依赖于旧版本的System.Reactive?

我有一个针对.Net 4.5.2的多项目Visual Studio解决方案.在其中一个项目(WPF应用程序)中,我使用nuget添加System.Reactive版本3.0.1000.0包,然后添加ReactiveUI 7.0.0.0包.

在WPF应用程序使用的另一个项目库中,我只添加了System.Reactive版本3.0.1000.0包.

ReactiveUI包似乎依赖于一组旧的反应包(RX-Core2.2.5等).我可以告诉你,因为WPF应用程序项目文件中的HintPaths指向诸如packages\Rx-Core.2.2.5\lib \net45\System.Reactive.Core.dll之类的位置

当我构建并运行应用程序时,我得到一个FileLoadException,因为至少有一个项目试图使用错误的dll版本.以下是典型的....

System.IO.FileLoadException occurred
  HResult=0x80131040
  Message=Could not load file or assembly 'System.Reactive.Linq, Version=3.0.1000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Run Code Online (Sandbox Code Playgroud)

我可以通过将解决方案中的所有System.Reactive软件包降级到2.2.5来解决这个问题,但这似乎是一个非常旧的版本(2014).

为什么ReactiveUI会依赖System.Reactive的v2.2.5?有没有办法改变这种行为,以便我可以在整个解决方案中使用最新版本的System.Reactive?

.net c# nuget reactiveui reactive

9
推荐指数
1
解决办法
974
查看次数

从 WindowsAzure.Storage 迁移到 Azure.Storage 包时引用 CloudStorageAccount 中的服务

我有一个代码库,它广泛使用WindowsAzure.Storage nuget 包来访问队列、表和 Blob。该包现在被标记为已弃用,并指示该功能已分解为Azure.Storage包集下的各个组件。

此 StackOverflow 问答提供了替换包的一些描述,但尚不清楚重组完成了多少,以及此时需要迁移哪些旧包和新包的组合。

我一直无法找到任何最新的迁移指南,并且新软件包的示例代码/文档往往侧重于基本操作。

具体来说,我很难从顶级存储帐户访问新服务。

当前的代码使用这样的模式......

    var accountName = "...";
    var accountKey ="..............";
    var credentials = new StorageCredentials(accountName, accountKey);
    var account = new CloudStorageAccount(credentials,true);

    //for table access...
    var client = account.CreateCloudTableClient();
    var table = client.GetTableReference(tableName);
    
    //for queue access
    var client = account.CreateCloudQueueClient();
    var queue = client.GetQueueReference(queueName);
    
    //for blob access 
    var client = account.CreateCloudBlobClient();
    var container = client.GetContainerReference(containerName);
    var blob =   container.GetBlockBlobReference(path);
        
Run Code Online (Sandbox Code Playgroud)

使用新软件包的等效内容是什么以及我需要什么软件包组合?

c# azure

9
推荐指数
1
解决办法
8156
查看次数

如何配置 Automapper 4 以允许空目标值

我在解决如何获取Automapper 4.2.1以允许类型映射时遇到一些问题,其中目标值可能为空,具体取决于源值。

旧版本的 Automapper 允许通过 Mapper 配置设置AllowNullDestination标志,但我找不到新版本的等效配方,并且通过静态 Mapper 对象进行配置的旧机制似乎已过时。

我尝试了以下方法但没有成功:

  • Mapper.Configuration.AllowNullDestinationValues = true;
  • Mapper.AllowNullDestinationValues = true;
  • Mapper.Initialize(c=>c.AllowNullDestinationValues=true);

这是一个演示该问题的简单测试用例。由于 Substitute 方法返回 null,因此在最后一行失败并出现 AutoMapperMappingException 我希望这两个映射都能成功。

我宁愿避免在解决方案中使用.ForMember,因为在我试图解决的实际场景中,bool 和“object”(实际上是自定义类)之间的映射应该应用于整个对象树。

尽管 StackOverflow 上有几个类似的问题,但我还没有找到涉及 Automapper 最新版本的问题。

在此先感谢您的任何建议

using AutoMapper;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace AutoMapperTest
{
    [TestClass]
    public class ExampleTest
    {
        [TestMethod]
        public void NullDestinationCanBeMapped()
        {
            var mapper = new MapperConfiguration(configuration =>
            {
                configuration.CreateMap<Source, Target>();
                //How should the following mapping be modified to pass the test?   
                configuration.CreateMap<bool, object>()
                .Substitute(i => i …
Run Code Online (Sandbox Code Playgroud)

c# automapper automapper-4

5
推荐指数
1
解决办法
4223
查看次数

新的 C# 语言功能可以用于清理 Task.WhenAll 语法吗?

随着“无处不在的异步”,触发多个异构操作的能力变得越来越频繁。当前Task.WhenAll方法以数组形式返回结果,并要求所有任务返回相同类型的对象,这使得它的使用有点笨拙。我希望能够写...

var (i, s, ...) = await AsyncExtensions.WhenAll(
                          GetAnIntFromARemoteServiceAsync(),
                          GetAStringFromARemoteServiceAsync(),
                          ... arbitrary list of tasks   
                         );
Console.WriteLine($"Generated int {i} and string {s} ... and other things");
Run Code Online (Sandbox Code Playgroud)

我能想到的最好的实现是

public static class AsyncExtensions
{
  public static async Task<(TA , TB )> WhenAll<TA, TB>(Task<TA> operation1, Task<TB> operation2)
  {
             return (await operation1, await operation2;
  }
}
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是我需要实现最多 N 个参数的单独方法。根据这个答案,这只是使用泛型的限制。此实现还存在无法支持返回 void 的任务的限制,但这不是一个问题。

我的问题是:即将推出的语言功能是否允许采用更简洁的方法来解决此问题?

c# asynchronous task c#-8.0

4
推荐指数
1
解决办法
322
查看次数