小编gui*_*e31的帖子

在PowerShell中获取.Net对象异步方法的结果

我试图在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脚本.我想反过来,但似乎没有人对此感兴趣.这是否可能,如果没有,为什么?

powershell async-await

14
推荐指数
3
解决办法
7865
查看次数

如何保持单元测试简单和隔离,并仍然保证DDD不变量?

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

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

F#无序集合类型表示资源和成本

为了练习一点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>但"基于二叉树"部分让我有点困惑,我不确定它是否适合我的需要.

你怎么看 ?我错过了设计中明显的东西吗?

collections f# types units-of-measurement

6
推荐指数
1
解决办法
192
查看次数

Web应用程序中的数据访问应该在不同的任务上运行

我正在编写一系列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倍的性能提升.他的情景非常接近我的.考虑到这里的答案,我无法理解如何做到这一点,对于做什么感到有点困惑......

c# asp.net multithreading asynchronous asp.net-web-api

2
推荐指数
1
解决办法
141
查看次数