小编Pei*_*ein的帖子

域事件中的新实体ID

我正在使用CQRS和域事件概念构建具有域模型的应用程序(但没有事件源,只是普通的旧SQL).SomethingChanged类型的事件没有问题.然后我陷入了实施SomethingCreated事件的困境.

当我创建一个映射到具有身份主键的表的实体时,在实体被持久化之前我不知道Id.实体是持久性无知的,所以当从实体内部发布事件时,Id只是不知道 - 它只是在调用context.SaveChanges()之后神奇地设置.那么我如何/何时/何时将Id放入事件数据中?

我在考虑:

  • 包括事件中对实体的引用.这可以在域内工作,但不一定在具有通过事件/消息进行多个自治系统通信的分布式环境中.
  • 重写SaveChanges()以某种方式更新排队以进行发布的事件.但事件是不可改变的,所以这看起来很脏.
  • 删除标识字段并使用实体构造函数中生成的GUID.这可能是最简单的,但可能会影响性能并使其他事情变得更难,例如调试或查询(where id = 'B85E62C3-DC56-40C0-852A-49F759AC68FB',不MIN,MAX等等).这就是我在许多示例应用程序中看到的内容.
  • 混合方法 - 单独保留标识并将其主要用于外键和更快的连接,但使用GUID作为唯一标识符,通过该标识符从应用程序中的存储库中提取实体.

domain-driven-design entity-framework cqrs domain-events

12
推荐指数
1
解决办法
1579
查看次数

在Autofac中注册异步工厂

我有一个从存储库中获取的Wallet类.我正在尝试在Autofac中正确注册,因此使用钱包的类可以注入适当的实例.问题是存储库使用异步方法(返回Task).Autofac是否支持此类案例?

这不起作用:

cb.RegisterType<WalletRepository>()
    .As<IWalletRepository>()
    .SingleInstance();
cb.Register(async c => await c.Resolve<IWalletRepository>().CreateAsync(App.WalletPath));
cb.RegisterType<ViewModel>()
    .AsSelf().
    .SingleInstance();
Run Code Online (Sandbox Code Playgroud)

在应用程序的某个地方我只有:

class ViewModel
{
    public ViewModel(Wallet wallet)
    {
        //nothing fancy here
    }
}
Run Code Online (Sandbox Code Playgroud)

在致电时container.Resolve<ViewModel>()我得到一个例外,说钱包没有注册.

c# autofac async-await c#-5.0

5
推荐指数
1
解决办法
4269
查看次数