- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个场景,其中单个节点上的所有处理程序都应该在调用所有处理程序后提交的单个“工作单元”上运行。我认为最好的方法是执行以下操作:
收到消息后,将这些操作作为管道的一部分执行:
你能给我提示如何定制 Rebus 管道以满足上述要求吗?
我已经结束了:
private static IBus _bus;
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>();
services.AddMvc();
services.AddTransient<IBus>(sp => _bus);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
StartRebus(app);
...
}
public static void StartRebus(this IApplicationBuilder app)
{
var rebusServices = new ServiceCollection();
rebusServices.AutoRegisterHandlersFromAssemblyOf<ActivityDenormalizer>();
rebusServices.AddTransient<MyDbContext>(sp =>
{
var messageContext = MessageContext.Current
?? throw new InvalidOperationException("MessageContext.Current is null.");
return messageContext.TransactionContext.Items
.GetOrThrow<MyDbContext>(nameof(MyDbContext));
});
rebusServices.AddRebus((configure, sp) => configure
.Transport(t => t.UseInMemoryTransport(new InMemNetwork(), "Messages"))
.Options(o =>
{
o.EnableUnitOfWork<MyDbContext>(
unitOfWorkFactoryMethod: messageContext =>
{
//create new dbcontext instance regardless of ServiceLifeTime.
//Notice that I'm using ApplicationServices here, not RebusServices.
var dbContext = ActivatorUtilities.CreateInstance<MyDbContext>(app.ApplicationServices);
messageContext.TransactionContext.Items[nameof(MyDbContext)] = dbContext;
return dbContext;
},
commitAction: (messageContext, dbContext) => dbContext.SaveChanges(),
cleanupAction: (messageContext, dbContext) => dbContext.Dispose());
}));
var rebusServiceProvider = rebusServices.BuildServiceProvider();
rebusServiceProvider.UseRebus();
_bus = rebusServiceProvider.GetRequiredService<IBus>();
}
应用程序服务和 rebus 服务在两个地方互连:
IBus 由 rebusServiceProvider
解析,但该实例也在应用程序服务中注册,因此我可以从我的应用程序向它发送消息。
MyDbContext 依赖项(DbContextOptions 等)由 ApplicationServices 解析,但 DbContext 也在 Rebus 的 unitOfWorkFactoryMethod
中实例化并在 rebusServices 中注册,以便它可以注入(inject) Rebus 处理程序。
最佳答案
是的——查看Rebus.UnitOfWork – 它有您需要的 Hook 。
具体来说,对于 Entity Framework,您可以执行如下操作:
Configure.With(new CastleWindsorContainerAdapter(container))
.Transport(t => t.UseMsmq("test"))
.Options(o => o.EnableUnitOfWork(
async context => new CustomUnitOfWork(context, connectionString),
commitAction: async (context, uow) => await uow.Commit()
))
.Start();
CustomUnitOfWork
看起来像这样:
class CustomUnitOfWork
{
public const string ItemsKey = "current-db-context";
readonly MyDbContext _dbContext;
public CustomUnitOfWork(IMessageContext messageContext, string connectionString)
{
_dbContext = new MyDbContext(connectionString);
messageContext.TransactionContext.Items[ItemsKey] = this;
}
public async Task Commit()
{
await _dbContext.SaveChangesAsync();
}
public MyDbContext GetDbContext() => _dbContext;
}
然后您将设置您的 IoC 容器以通过从当前消息上下文中获取它来解析 MyDbContext
– 对于 CaSTLe Windsor,这将像这样完成:
container.Register(
Component.For<CustomUnitOfWork>()
.UsingFactoryMethod(k =>
{
var messageContext = MessageContext.Current
?? throw new InvalidOperationException("Can't inject uow outside of Rebus handler");
return messageContext.TransactionContext.Items
.GetOrThrow<CustomUnitOfWork>(CustomUnitOfWork.ItemsKey);
})
.LifestyleTransient(),
Component.For<MyDbContext>()
.UsingFactoryMethod(k => k.Resolve<CustomUnitOfWork>().GetDbContext())
.LifestyleTransient()
);
关于c# - 调用所有处理程序后如何提交 UoW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54129389/
我有一个场景,其中单个节点上的所有处理程序都应该在调用所有处理程序后提交的单个“工作单元”上运行。我认为最好的方法是执行以下操作: 收到消息后,将这些操作作为管道的一部分执行: 创建新的 DbCont
我知道这已经被做过一百万次了,但我仍然在想走哪条路: EF - UoW/存储库 - 服务 - 网络或 EF - 服务 - 网络 似乎 UoW/Repository 层是多余的,因为您可以模拟 DbCo
我正在尝试下面的代码,它有两个部分,一个是通过棱镜导航。当允许导航时,我会异步启动深度加载,但每次都有一个新的上下文。在后面的代码中,我想取消未完成此加载的挂起导航,但下面的代码甚至不起作用,所以取消
这是关于我对从这里找到的一些 Entity Framework Material 的一些困惑: https://www.asp.net/ 在此页面上,它解释了如何使用存储库包装 dbcontext 以
我相信有人在其他地方问过这个问题,但我找不到直接的解决方案。我的 Api 正在传递对象模型,在服务器端,未传递的该对象的每个值都被视为 null(有意义)。有什么方法可以告诉 EF6 不要以不必编写每
我今天遇到了一个问题,我无法解决,我搜索了很多都没有找到解决方案,如果可以的话请帮助我。 我正在实现一个 MVC 应用程序,它使用 EF + 存储库模式 + 工作单元,并将 Autofac 作为依赖注
我正在编写一个标量 plpgsql 函数,其中包含一个在数据库外部具有副作用的 C 函数。当函数被调用时,在一些任意 SQL(触发、选择、写入等)中,我希望在 PostgreSQL 工作单元 (UOW
我有两个问题,第一个是缩放并在负载测试时变得可见。 在负载下,事情很快(10 个或更少并发)失败并出现错误: There is already an open DataReader associate
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
DbContext 的描述说:“一个 DbContext 实例代表了工作单元和存储库模式的组合......”。但是许多开发人员倾向于创建自己的存储库和 UoW。 我应该使用 DbContext和 Db
我正在使用 NHibernate、DI/IoC 和工作单元模式。 我见过的大多数 UoW 示例都确保在同一时间只能有一个事件的 UoW/ session ,例如 this one和 this one
但是你如何使用它? 我有一个 Code First项目设置,并使用这个新的 EF6 尝试一些东西。阅读至少 2 岁关于 EF4/5 的各种帖子/博客。但是关于 EF6 什么都没有。 假设我有这些实体:
作为 nHibernate 的新手,我发现 session 的创建有点令人困惑。 为什么 nHibernate 没有提供像(我相信)工作单元那样的东西? 或者是否已经构建了一些东西,而 UofW 更多
在 DDD 中,聚合根可以有一个存储库。让我们拿一个 订购 聚合和它的非持久对应 订单库 和持久的对应 下单 .我们还有 ProductVariant 跟踪订单中产品库存的聚合。它可以有一个 Prod
在许多基本示例中,我看到 using block 包裹在 DbContext 用法中,如下所示: using (var context = new MyDbContext()) { /
我的机器上部署了一个 Websphere 服务器,我正在返回: java.lang.NoClassDefFoundError:com.ibm.wsspi.uow.UOWManager 每当我查看在 W
我正在使用 MVC5 和 EF Code First 以及 Repository 和 Unit of Work 构建网络应用程序> 图案。到目前为止,我有 3 层: 包含存储库 UOW 的“数据层”。
最近我开始深入研究存储库模式和 UnitOfWork 的概念,同时探索 EntityFramework。 根据 MVC 示例制作了我自己的实现,他们在其中从 Controller 中处理 UnitOf
我刚刚开始阅读有关使用存储库和工作单元模式的内容。我目前正在尝试在 asp.net Web 表单应用程序中将它与 Entity Framework 一起使用。但是,我确实有一个问题,我不确定是否能够以
我是新来的 NHibernate我正在尝试为在 ASP.NET MVC 3 应用程序中使用引入通用存储库模式和工作单元。我用谷歌搜索标题并找到了新链接;但对我来说,所有这些都更复杂。我使用 Struc
我是一名优秀的程序员,十分优秀!