我试图在Powershell中实例化的.Net对象上调用异步方法:
Add-Type -Path 'my.dll'
$myobj = new-object mynamespace.MyObj()
$res = $myobj.MyAsyncMethod("arg").Result
Write-Host "Result : " $res
Run Code Online (Sandbox Code Playgroud)
执行脚本时,shell似乎不会等待MyAsyncMethod().Result并且什么也不显示,尽管检查返回值表明它是正确的类型(Task<T>).各种其他尝试,例如中间变量Wait()等,没有给出任何结果.
我在网上找到的大部分内容都是从C#异步调用Powershell脚本.我想反过来,但似乎没有人对此感兴趣.这是否可能,如果没有,为什么?
DDD建议域对象随时都应处于有效状态.聚合根负责保证不变量和工厂用于组装具有所有必需部分的对象,以便它们在有效状态下初始化.
然而,这似乎使创建简单,隔离的单元测试的任务变得复杂化.
假设我们有一个包含Books的BookRepository.一本书有:
这些是必需的属性:一本书必须有一个作者,一个类别和至少一个书店,你可以从中购买这本书.可能有一个BookFactory,因为它是一个非常复杂的对象,而Factory将至少用所有提到的属性初始化Book.也许我们还会将Book构造函数设置为私有(以及Factory嵌套),这样除了Factory之外没有人可以实例化一个空的Book.
现在我们要对BookRepository的一个方法进行单元测试,该方法返回所有的Books.为了测试该方法是否返回书籍,我们必须设置一个测试上下文(AAA术语中的Arrange步骤),其中一些Books已经存储在Repository中.
在C#中:
[Test]
public void GetAllBooks_Returns_All_Books()
{
//Lengthy and messy Arrange section
BookRepository bookRepository = new BookRepository();
Author evans = new Author("Evans", "Eric");
BookCategory category = new BookCategory("Software Development");
Address address = new Address("55 Plumtree Road");
BookStore bookStore = BookStoreFactory.Create("The Plum Bookshop", address);
IList<BookStore> bookstores = new List<BookStore>() { bookStore };
Book domainDrivenDesign = BookFactory.Create("Domain Driven Design", evans, category, bookstores);
Book otherBook = BookFactory.Create("other book", evans, category, bookstores);
bookRepository.Add(domainDrivenDesign);
bookRepository.Add(otherBook);
IList<Book> returnedBooks = …Run Code Online (Sandbox Code Playgroud) unit-testing domain-driven-design mocking stub ddd-repositories
为了练习一点F#,我正在建立一个简单的游戏.游戏涉及resources玩家可以花费.有3种资源.游戏中的项目和动作具有关联cost,可以组合任意数量的这些资源的数量(或者没有,用于自由行动).我开始实现这一点很多:在F#中创建一个包含多个浮点数测量单位的列表
[<Measure>] type gold
[<Measure>] type wood
[<Measure>] type stone
type Resource =
| Gold of int<gold>
| Wood of int<wood>
| Stone of int<stone>
Run Code Online (Sandbox Code Playgroud)
现在我需要一个集合数据类型来表示一个cost.我希望它:
包含Resources.理想情况下,它将被限制为每种类型不超过1个资源,但我可以不用安全.
无序.理想情况下(1<gold>, 2<wood>)需要平等(2<wood>, 1<gold>)而不重新定义类型的相等性.
可以轻松地与另一个相同类型的集合(动作可能有可选成本,这将加上正常成本)和可减少(从玩家的资源池).
什么是一个很好的F#集合类型呢?我意识到没有多少是无序的.我在看,Set<'T>但"基于二叉树"部分让我有点困惑,我不确定它是否适合我的需要.
你怎么看 ?我错过了设计中明显的东西吗?
我正在编写一系列ASP.Net Web Api服务,它们基本上从数据库中获取数据并将其返回.
我们现在决定重用之前写得不好的数据访问对象(让我们称之为PoorDAO),这些对象使用ADO.Net来调用数据库中的存储过程.
未来的一个改进是重写该数据访问层以受益于使用Entity Framework的异步数据调用.
因此,我们决定PoorDAO在Repositories中实现一个实现暴露异步方法的接口.我们的想法是为将来的EF异步存储库保留相同的接口:
// future common interface
public interface ICountryRepository
{
Task<Country> GetAllCountries();
}
// current implementation hiding a PoorDAO in shame
public class CountryRepository : ICountryRepository
{
public Task<Country> GetAllCountries()
{
var countries = PoorCountryDAO.GetAllcountries(); // poor static API call
// some data transformation ...
return Task.FromResult(result);
}
}
Run Code Online (Sandbox Code Playgroud)
我们这里所拥有的基本上是隐藏在异步服装中的同步操作.这一切都很好,但我的问题是:虽然我们处于这种状态,但是让方法完全异步并且调用await Task.Run(() => poorCountryDAO.GetAllcountries())而不是仅仅是更好poorCountryDAO.GetAllcountries()吗?
据我所知,这将释放当前正在运行Web Api服务HTTP请求的IIS线程,并创建或重用另一个线程.该线程将被阻塞,等待DB响应而不是被阻塞的IIS线程.这有更好的资源明智吗?我是否完全误解或过度解释了Task.Run()的工作原理?
编辑:我遇到过这篇文章,声称在某些情况下,异步数据库调用可以带来8倍的性能提升.他的情景非常接近我的.考虑到这里的答案,我无法理解如何做到这一点,对于做什么感到有点困惑......
asp.net ×1
async-await ×1
asynchronous ×1
c# ×1
collections ×1
f# ×1
mocking ×1
powershell ×1
stub ×1
types ×1
unit-testing ×1