所有,
我们正在使用ASP.NET Web API,我们有一个基于REST的服务,其中包含有效负载的JSON.如果我将以下日期作为字符串传递,例如
sampleObj: {
...
myDate: "31/12/2011 00:00:00",
...
}
Run Code Online (Sandbox Code Playgroud)
作为JSON有效内容中的属性值,date属性被反序列化为DateTime.MinValue.字符串格式有效吗?
我们知道格式"2012-10-17 07:45:00"成功序列化,但我们不能保证收到的所有日期都是这种格式.什么是有效的选择?
我有以下类型:
type GoodResource = {
Id:int;
Field1:string }
type ErrorResource = {
StatusCode:int;
Description:string }
Run Code Online (Sandbox Code Playgroud)
我有以下歧视联盟:
type ProcessingResult =
| Good of GoodResource
| Error of ErrorResource
Run Code Online (Sandbox Code Playgroud)
然后想要一个具有被区分联合ProcessingResult的返回类型的函数:
let SampleProcessingFunction value =
match value with
| "GoodScenario" -> { Id = 123; Field1 = "field1data" }
| _ -> { StatusCode = 456; Description = "desc" }
Run Code Online (Sandbox Code Playgroud)
是我想做的事情.编译器发出声明它希望GoodResource是返回类型.我错过了什么,或者我是否完全以错误的方式解决这个问题?
我很熟悉在F#中没有等效的"return"关键字.
然而,我们最近遇到了一个问题,我们需要一个包含许多步骤的工作流程,其中每个步骤都可以返回好的或坏的结果.如果在任何步骤中发现不良结果,我们想退出工作流程 - 并提前退出!
我们通过有效地检查每个步骤中的错误(即函数)来解决它,但我不认为这是正确的方法 - 它是低效的,我们不提前退出.
工作流程中的示例函数如下:
let StepB stepAResult someParameters =
match stepAResult with
| Good(validResourceData) ->
// Do current step processing
// Return current step result
| Error(error) -> error |> Result.Error
Run Code Online (Sandbox Code Playgroud)
工作流本身如下:
let Workflow someParameters =
let stepAResult = StepA someParameters
let stepBResult = StepB stepAResult someParameters
let stepCResult = StepC stepBResult someParameters
let stepDResult = StepD stepCResult someParameters
stepDResult
Run Code Online (Sandbox Code Playgroud)
因此,每个样本函数都会接收上一个函数的结果,并且只有在没有错误时才执行当前步骤!
我遇到的问题是,如果StepA因错误而失败,则仍会调用其他所有步骤.
是否存在"早期返回"的"功能"方式,而不是调用工作流中的每个功能,我们必须每次检查错误?
使用NSubstitute,有没有办法捕获传递给属性设置器的值?
例如,如果我有以下界面:
public interface IStudent {
int Id { set; }
string Name { set; }
}
Run Code Online (Sandbox Code Playgroud)
说我有一个替代品,例如:
var _studentSub = Substitute.For<IStudent>();
Run Code Online (Sandbox Code Playgroud)
如果调用替代的任何"set"方法,我有什么方法可以拦截和捕获值?
所有,
我们使用NHiberate 2.1,我们存储十进制值(汇率),例如123.1234567到7位小数
我们使用默认映射样式映射类型:
<property name="ExchangeRate" not-null="true" />
Run Code Online (Sandbox Code Playgroud)
但是当我们升级到NHibernate 3.0时,上面的值保存为123.1234500.
它没有在3.0发行说明中指定此行为更改,尽管它似乎详细说明问题[NH-1594],十进制的默认值是DECIMAL(19,5)
我们有一个解决方案,即指定以下映射:
<property name="ExchangeRate" type="decimal(10,7) not-null="true" />
Run Code Online (Sandbox Code Playgroud)
我需要知道这个解决方案是解决这个问题的正确方法吗?此外,为什么在2.1和3.0之间的舍入行为会发生功能性变化?
干杯,
比利栈
使用SqlDataConnection类型提供程序的常规方法如下:
type dbSchema = SqlDataConnection<"Data Source=MYSERVER\INSTANCE;InitialCatalog=MyDatabase;Integrated Security=SSPI;">
let db = dbSchema.GetDataContext()
Run Code Online (Sandbox Code Playgroud)
但是我们遇到一个问题,我们希望在f#脚本中使用此类型提供程序,其中数据库的连接字符串作为参数传递.所以我想做的是这样的:
let connectionString= Array.get args 1
type dbSchema = SqlDataConnection<connectionString>
Run Code Online (Sandbox Code Playgroud)
但是它会给出错误"这不是常量表达式或有效的自定义属性值"
有没有办法做到这一点?
如果我有一个函数是模块的一部分,并且我想在函数内部进行日志条目,我必须手动打印函数名称空间和名称,例如
namespace MyModuleNamespace
module MyModule =
let AddTwoNums logger x y =
logger.Info("MyModuleNamespace.AddTwoNums - Start")
let res = x+y
logger.Info("MyModuleNamespace.AddTwoNums - End")
res
Run Code Online (Sandbox Code Playgroud)
有什么方法可以自动解决"MyModuleNamespace.AddTwoNums"的问题,因为它非常麻烦/容易出错,尤其是在重构代码时必须重命名函数和模块时
即使无法做到,有什么方法可以自动解决"AddTwoNums"是什么,即功能名称?
在F#中,您可以在函数签名上进行模式匹配.我想用一个函数来装饰一些函数,该函数测量函数的执行并调用statsd.我目前的功能是:
let WrapFunctionWithPrefix(metrics:Metric.Client.IRecorder, functionToWrap, prefix) =
let metricsIdentifier = (sprintf "%s.%s" prefix Environment.MachineName)
using (metrics.StartTimer(metricsIdentifier)) ( fun metrics -> functionToWrap)
Run Code Online (Sandbox Code Playgroud)
如您所见,前缀会有所不同,在我们的应用程序中,这将根据函数定义而有所不同.因此,每次我想要执行以下操作时,不必传递度量前缀:
let WrapFunction metrics afunc =
match afunc with
| :? (int -> int) -> WrapFunctionWithPrefix(metrics, afunc, "My function 1")
| :? (string -> string) -> WrapFunctionWithPrefix(metrics, afunc, "My function 2")
| _ -> failwith "Unknown function def"
Run Code Online (Sandbox Code Playgroud)
基于F#中的函数签名是否有任何模式匹配方式?
任何帮助赞赏.
比利
最近,我们遇到了一个F#代码调用C#代码的问题。我已经尽可能简化了这个问题。C#代码如下:
using System;
namespace CSharpLib
{
public abstract class InputMessageParent
{
public readonly Guid Id;
protected InputMessageParent(Guid id) { this.Id = id; }
}
public class Result { public string ResultString; }
public enum FunctionResult
{
None,
Good,
Bad
}
public class ConfigurationBuilder
{
public Result DoWork<TMessage>(
string param1,
Func<TMessage, FunctionResult> action)
where TMessage : InputMessageParent
{
return new Result() { ResultString = "Good" };
}
}
}
Run Code Online (Sandbox Code Playgroud)
F#代码需要调用ConfigurationBuilders DoWork函数。请注意,DoWork函数采用两个参数,一个简单的字符串和一个Func作为第二个参数。Func接受必须从InputMessageParent继承的TMessage,并返回简单的Result类型。F#代码如下:
open System
type InputMessageConcreteTypeA =
inherit CSharpLib.InputMessageParent
val Property1:string
new …Run Code Online (Sandbox Code Playgroud) 我有一个名为Assembly1的F#程序集
我有以下模块:
namespace Assembly1
module MyModule =
type MyClass(x: int, y: int) =
new() = MyClass(0, 0)
Run Code Online (Sandbox Code Playgroud)
在引用此F#程序集的C#程序集中,以下代码为我提供了一个'null'值:
var myType = Type.GetType("Assembly1.MyModule.MyClass, Assembly1");
Run Code Online (Sandbox Code Playgroud)
我想做的不可能吗?
f# ×7
c# ×2
c#-to-f# ×2
decimal ×1
json.net ×1
logging ×1
mocking ×1
nhibernate ×1
nsubstitute ×1
precision ×1
reflection ×1
statsd ×1