【发布时间】:2015-07-09 10:55:15
【问题描述】:
我对使用 Simple Injector 的 EF 的 DBContext 的生命周期有疑问,我有一个连续运行的工作服务,但我希望 DBContext 在消息的生命周期内初始化,而不是在生命周期内初始化Worker 服务申请的时间。
有一些关于如何使用 Autofac 执行此操作的示例,但我在使用 Simple Injector 时遇到了麻烦。以前有人这样做过吗?
见:http://nblumhardt.com/2011/01/an-autofac-lifetime-primer/
我们注册的当前实现是:
var registration = applicationLifestyle.CreateRegistration<ProjectContext>(container);
container.AddRegistration(typeof(IProjectContext), registration);
container.AddRegistration(typeof(ProjectContext), registration);
在工作模块内部我们有:
container.RegisterModuleScoped(new CodeModule(), Lifestyle.Transient);
但是,我们不想为 DBContext 使用 Lifestyle Transient,我们希望它在消息处理程序期间处于活动状态。
更新:
Steven,这听起来不错的解决方案,只是在注册 IMessageHandler<T> 时遇到了一些问题,例如
LifetimeScopeMessageHandlerDecorator 类型的构造函数包含未注册的名为“decorateeFactory”的Func<NoticeMessageHandler> 类型参数。
我之前尝试过注册它并试图将其排除在外,并且有很多变化,但没有运气。以下是我注册装饰器的方式:
container.RegisterSingleDecorator(
typeof(NoticeMessageHandler),
typeof(LifetimeScopeMessageHandlerDecorator));
错误:
LifetimeScopeMessageHandlerDecorator 类型的构造函数包含未注册的名为“decorateeFactory”的
Func<NoticeMessageHandler>类型参数。
【问题讨论】:
-
使用生命周期范围,参见here,并在消息生命周期开始时启动范围。
-
同时阅读[装饰器文档](simpleinjector.readthedocs.org/en/latest/…)。您得到的异常表明该类不是装饰器。如果您仍然遇到问题,请同时发布您的装饰器的代码。
标签: c# entity-framework inversion-of-control simple-injector easynetq