我对包装感到困惑HttpClient.之前它被分发为Microsoft.Http.NetNuGet包的一部分,而System.Net.Http被认为是遗留的.现在看起来恰恰相反:System.Net.Http所有平台Microsoft.Net.Http都有一个全新的软件包,并且暂时没有更新,据微软开发团队的人员称,将被弃用.
那么问题:
Microsoft.Net.Http用(最新的)替换NuGet包的依赖项System.Net.Http吗?Microsoft.Net.Http?那么非Windows平台(iOS,Android)呢?新的System.Net.Http支持他们,但我记得Microsoft.Net.Http我只好另外安装Microsoft.Bcl.Build,并Microsoft.Bcl以获得跨平台的东西的工作.System.Net.Http不依赖于他们.可以跳过Bcl包吗?System.Net.Http缺少一些Http扩展方法,SupportsPreAuthenticate并试图调用这些方法导致运行时错误(缺少方法).我们该如何应对?F #powerpack附带了一组转换方法,可以从Func <...>转换为F#函数,无论是标准函数还是Tuple函数.但是有可能实现相反的目的:如果你想从F#代码调用一个C#方法,它接受Func <...>并想使用原生的F#lambda表达式(例如fun x - > some_function_of(x))?
如果我将带有签名'a - >'b的F#函数发送到期望Func的C#方法,那么F#编译器会生成以下错误:
This expression was expected to have type Function<'T,'R> but here has type 'T -> 'R
我想继续使用F#lambda表达式,但要使用转换层,以便能够将它们作为C#Func lambda发送.这可以实现吗?
我们开始将Serilog与Elasticsearch结合使用,这是一种非常有效的方式来存储结构日志数据(之后使用像Kibana这样的工具可视化它们).但是,我看到了不直接将日志数据写入后端的优势,而是配置了一个日志代理,例如Logstash,可以负责为日志消息添加标签,选择索引等.使用此设置,应用程序将不需要具备知识日志数据分发.
Logstash位于中间,问题是Serilog接收器最好使用,因此Logstash可以导入其数据,而无需应用高级和CPU密集型过滤器.我已经看到Redis被提到是Logstash的好伴侣,但是Serilog没有Redis接收器.对于Serilog接收的任何建议哪些数据可以通过Logstash轻松传输到Elasticsearch索引?
甚至有一种方法首先使用Elasticsearch sink,然后在一些安排和应用额外标签之后再次将其环回到Elasticsearch.
Serilog有一种方便的对象解构方法,如下例所示:
logger.Debug(exception, "This is an {Exception} text", exception);
logger.Debug(exception, "This is an {@Exception} structure", exception);
Run Code Online (Sandbox Code Playgroud)
第一行导致记录器将异常记录为纯文本(通过调用ToString()),第二行使记录器将异常属性写为单独的字段.但是这个重载呢:
logger.Debug(exception, "This is an exception", exception);
Run Code Online (Sandbox Code Playgroud)
这个作为第一个参数使用异常,它总是写成一个字符串.我想要做的是以结构化的方式启用日志记录异常.是否可以配置Serilog来实现这一目标?
UPDATE.我想这个问题会导致记录异常的另一个方面:如何确保使用异常属性来丰富消息(因此它们以结构化的方式记录到富散问件,如Elasticsearch),而无需将所有异常属性写入呈现的文本消息(所以纯文本记录器没有大量的异常细节).
我使用Newtonsoft.Json序列化程序将C#类转换为JSON.对于某些类,我不需要序列化程序将实例添加到单个属性,而只需要在对象上调用ToString,即
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString() { return string.Format("{0} {1}", FirstName, LastName ); }
}
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能将Person对象序列化为ToString()方法的结果?我可能有很多像这样的类,所以我不想最终得到一个特定于Person类的序列化器,我希望有一个可以适用于任何classe(通过属性我猜).
用户故事传统上写作表达"作为[用户类型]我想要[功能]以便[某些好处]".在书籍和在线资源中[用户类型]通常对应于人类的角色.但是,在描述系统内部的功能时,通常更容易将某些无人值守服务置于用户的位置,例如"作为ServiceX,我希望定期刷新一些数据,以便使用最新信息进行XYZ".
这种形式使得直接编写易于理解的系统相关部分的验收测试.但这概念上是对的吗?用户故事不应该基于具有商业价值的功能,并且由于系统和服务对获取业务价值不感兴趣,他们不应该成为用户故事的参与者吗?
我有父/子关系中的两个实体.另外,parent包含对"main"子项的引用,因此简化模型如下所示:
class Parent
{
int ParentId;
int? MainChildId;
}
class Child
{
int ChildId;
int ParentId;
}
Run Code Online (Sandbox Code Playgroud)
我现在遇到的问题是EF似乎无法在单个操作中处理父和子的创建.我收到错误"System.Data.UpdateException:无法确定依赖操作的有效排序.由于外键约束,模型要求或存储生成的值,可能存在依赖关系."
MainChildId是可空的,因此应该可以生成父项,子项,然后使用新生成的ChildId更新父项.这是EF不支持的东西吗?
F#Interactive(以及一般的REPL样式工具)是性能分析的理想入口.有什么比选择代码块并将其直接发送到将返回性能分析报告的分析器更容易的事情.不幸的是,现有的分析器看起来没有REPL支持:您必须将分析器附加到进程或指定可执行文件或Web应用程序以进行分析.
我最终要做的是将代码块包装到单元测试中的配置文件,然后针对NUnit命令行会话执行配置文件.但这是我们现在用F#做的最好的事情吗?
我正在努力为我的应用程序扩展支持的平台数量,它曾用于支持.NET4/Windows Store/Windows Phone,但我希望还能覆盖Android和iOS的Mono.我已经将所有业务逻辑,模型和视图模型都放到了可移植类库(PCL)中,但是我应该针对哪个平台子集这是一个很大的困境.每种组合都会导致失败.以下是我可能使用的4个平台的结果:
配置文件78(NET45 + WP8 + Store):TPL,await/async和CallerMemberName属性支持没有问题(在BindableBase视图模型基类中使用).但引用此类库的Mono.Android项目无法构建抱怨应该引用的不存在的System.Runtime.dll.
配置文件104(NET45 + SL4 + WP75 + Store):await/async不起作用,找不到CallerMember名称,但是如果删除对它们的所有引用,Android项目构建正常.
配置文件147(NET403 + SL5 + WP8 + Store):await/async不起作用,找不到CallerMember名称,但如果删除对它们的所有引用,Android项目构建正常.
配置文件158(NET45 + SL5 + WP8 + Store):await/async不起作用,找不到CallerMember名称,但是如果删除对它们的所有引用,Android项目构建正常.
所以我不确定该选择什么.配置文件78,104,147是有限的,配置文件78是唯一同时支持await/async和CallerMemberName使用BindableBase的配置文件,但它在Android上失败,抱怨System.Runtime.dll.因此,如果您对PCL配置文件最适合PCL定位Mono有经验,请分享您的想法.
我重构了一些我要使用的代码(相对新引入的)F#在FSharp.Core中定义的结果类型,如下所示:
type Result<'TOk,'TError> =
| Ok of 'TOk
| Error of 'TError
Run Code Online (Sandbox Code Playgroud)
一切都编译但在运行时应用程序失败,出现以下异常:
由于值类型不匹配,无法从程序集"SomeAssembly,Version = 1.25.24.0,Culture = neutral,PublicKeyToken = null"加载类型"Microsoft.FSharp.Core.FSharpResult`2".
如果我将定义复制到我的项目中,使其隐藏原始项目,一切正常.
app.config具有以下部分:
<dependentAssembly>
<Paket>True</Paket>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="4.4.1.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
并使用该指令更新项目文件 <TargetFSharpCoreVersion>4.4.1.0</TargetFSharpCoreVersion>
所以我不确定是什么原因导致这个错误.同样奇怪的是,错误消息声称FSharpResult应该驻留在项目程序集中,而不是FSharp.Core.dll.
UPDATE.正如评论中所建议的那样,只有在使用Visual Studio 2015构建应用程序时才会出现问题.这是一个可以重现问题的小型控制台程序:
open System
[<EntryPoint>]
let main argv =
let result = Result.Ok "Hello"
printfn "%A" result
0
Run Code Online (Sandbox Code Playgroud)
打开Visual Studio 2015,构建并运行项目,您应该看到以下错误:Unhandled Exception:System.TypeLoadException:无法从程序集'ResultTest,Version = 1.0.0.0加载类型'Microsoft.FSharp.Core.FSharpResult`2',由于值类型不匹配,Culture = neutral,PublicKeyToken = null'.在Program.main(String [] argv)
如果您有Visual Studio 2017并使用它重建应用程序,该应用程序将正常工作并打印结果:确定"你好"