我理解f#和c#异步模型之间的主要区别在于f#中,除非你调用类似Async.RunSynchronously的东西,否则异步执行不会开始.在c#中,当方法返回任务时,通常(并非总是)立即在后台线程中启动执行.
Async.AwaitTask文档说"返回一个等待给定任务完成并返回其结果的异步计算."
这是否意味着,当您调用返回任务的ac#方法时,执行已经在后台启动了?如果是这样,那么将它包装在Async类型中又有什么意义呢?
我最近开始阅读富域模型而不是贫血模型.我之前工作的所有项目都遵循服务模式.在我的新项目中,我正在尝试实现丰富的域模型.我遇到的一个问题是试图确定行为的位置(在哪个类中).考虑这个例子 -
public class Order
{
int OrderID;
string OrderName;
List<Items> OrderItems;
}
public class Item
{
int OrderID;
int ItemID;
string ItemName;
}
Run Code Online (Sandbox Code Playgroud)
所以在这个例子中,我在Item类中有AddItem方法.在我向订单添加Item之前,我需要确保传入有效的订单ID.所以我在AddItem方法中进行验证.我是否在正确的轨道上?或者我是否需要在Order类中创建验证,以告知OrderID是否有效?
考虑一个示例,其中用户使用两个 aspx 页面中的表单输入客户对象的值。使用第一种方法,在调用构造函数之前,两个 aspx 页面都需要验证 ID 大于 0 并且 FirstName 不为空。使用第二个选项,两个页面都可以调用验证函数并向用户显示错误消息。
根据上面的例子,我更喜欢第二种选择。然而,当我在网上研究时,我不断发现它更面向对象,立即抛出异常而不让对象接受无效数据。正如我之前所说,除了例外情况,调用此构造函数的每个页面都需要验证输入是否有效。我不喜欢重复这个逻辑,所以我更喜欢第二种选择。
领域驱动设计方面的首选选项是什么?
选项1
public class Customer{
public int ID { get; set; }
public string FirstName { get; set; }
public Customer(int ID, string FirstName){
if (ID < 0)
throw new Exception("ID cannot be less than 0");
if (string.IsNullOrEmpty(FirstName))
throw new Exception("First Name cannot be empty");
this.ID = ID;
this.FirstName = FirstName;
}
}
Run Code Online (Sandbox Code Playgroud)
选项2
public class Customer{
public int ID { get; set; }
public string FirstName { …Run Code Online (Sandbox Code Playgroud) 我正在寻找国际象棋图书馆.我经常看到正在使用Trial.lift和Trial.bind函数.如果我理解正确,Trial.lift接受一个函数参数并执行并返回该函数,如果管道中的结果是成功的.如果这是真的,那么Trial.bind不会做同样的事情吗?
我是演员模型的新手。我正计划为我的一个项目实现 Actor 模型,因此我开始阅读有关 Akka.Net 的内容。从文档中可以看出,Actor 的状态在 Actor 的整个生命周期中都保持不变。
1.状态存储在哪里?在公羊上?如果是这样的话,我们的内存空间会不会用完?
2.当我有数百万条记录时,如何实现Actor模型?假设我想为拥有一百万条记录的客户表实现一个 Actor。我将如何加载客户?
我正在学习f#,我知道在调用函数时你不需要使用括号.
防爆
let addOne arg1 =
arg1 + 1
addOne 1
Run Code Online (Sandbox Code Playgroud)
VS
this.GetType()
Run Code Online (Sandbox Code Playgroud)
为什么我必须在第二个函数上使用括号?
我有一个像这样的歧视联盟:
Type Result =
| Good of bool | Bad of bool
Run Code Online (Sandbox Code Playgroud)
在许多情况下,我知道结果是好的.要打开结果,我必须使用模式匹配仅适用于Good选项.结果我收到一条警告(不是错误),上面写着"此表达式上的模式匹配不完整......".有没有办法解开,而不必使用模式匹配?
在下面的例子中,我使用的是Type缩写.为什么我应该使用fun关键字,而不是在没有fun关键字的情况下调用它?
type AdditionFunction = int->int->int
let f:AdditionFunction = fun a b -> a + b
Run Code Online (Sandbox Code Playgroud) 我经常看到调用ToList会使查询每次都执行.我有点困惑.那么在这种情况下,第二次调用ToList会使查询多次执行吗?在什么情况下查询会多次执行?
//This gets from database and ToList is already called here
List<Customer> Customers = GetCustomersFromDataBase();
//ToList is called here again
List<Customer> FilteredCustomers = (from c in Customerswhere c.id == 1c).ToList();
Run Code Online (Sandbox Code Playgroud)
编辑
我刚刚提供了这个代码示例来了解ToList真正做了什么.我没有这样实现它.此外,我进行存储过程调用以从db返回客户,并从返回的数据表创建客户列表.
现在,我知道可以将第一行代码缩短为第二行。这是我第一次遇到它,找不到关于该运算符的任何文档。它是否也可以用于其他事物的抽象概念?
let contains optValue value =
Option.exists (fun v -> v >= value) optValue
let contains optValue value =
Option.exists ((>=) value) optValue
Run Code Online (Sandbox Code Playgroud) 我以下列方式插入客户.
DateTime d = DateTime.Now;
foreach(Customer cus in CustomerList)
{
cus.EntryDate = d;
}
SaveToDatbase(CustomerList);
Run Code Online (Sandbox Code Playgroud)
使用正确的输入日期成功保存日期,但是当我检索数据并将其与变量d进行比较时,它不匹配.
foreach(Customer cus in GetFromDatabase())
{
Response.Write(DateTime.Compare(cus.EntryDate, d));
}
Run Code Online (Sandbox Code Playgroud)
输出为1而不是0.我检查了插入的数据,它与d变量值匹配,毫秒.日期存储在sql server数据库中.我意识到的一件事是,如果我为cus.EntryDate和d重置毫秒为0,则输出为0.我在这里做错了什么?
我有一个像这样的歧视联盟
type foo =
| Yes of bool
| Number of decimal
Run Code Online (Sandbox Code Playgroud)
我有另一种类型,我试图将这个DS作为一个可以为空的成员
type test(value) =
member this.Value : Nullable<foo> = value
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,我得到"一个泛型构造要求类型"foo"有一个公共默认构造函数.我该如何解决这个问题?
从文档中可以看出Async.RunSynchronously运行异步计算并等待其结果.我也读到它与C#中的等待类似.我很好奇,如果它阻止线程直到它运行完成?