我有一个Web应用程序,其中注册了许多组件.LifestylePerWebRequest(),现在我决定实现Quartz.NET,一个.NET作业调度库,它在不同的线程中执行,而不是Request线程.
因此,HttpContext.Current收益率null.IDbConnection到目前为止,我的服务,存储库和实例已被使用,.LifestylePerWebRequest()因为它使得在请求结束时更容易处理它们.
现在我想在两种情况下使用这些组件,在Web请求期间我希望它们不受影响,在非请求上下文中我希望它们使用不同的生活方式,我想我可以自己处理处理,但我该怎么办关于它根据当前背景选择组件的生活方式?
目前我注册服务(例如),像这样:
container.Register(
AllTypes
.FromAssemblyContaining<EmailService>()
.Where(t => t.Name.EndsWith("Service"))
.WithService.Select(IoC.SelectByInterfaceConvention)
.LifestylePerWebRequest()
);
Run Code Online (Sandbox Code Playgroud)
我想我应该使用某种扩展方法,但我只是看不到它..
c# castle-windsor inversion-of-control quartz.net asp.net-mvc-3
我SimpleInjector用作我的IoC库.我DbContext根据网络请求注册,它工作正常.但是我有一个任务是在后台线程中运行它.所以,我有一个问题来创建DbContext实例.例如
Service1 有一个实例 DbContextService2 有一个实例 DbContext Service1并Service2从后台线程运行.Service1 获取实体并将其传递给 Service2Service2 使用该实体,但实体与之分离 DbContext实际上问题出在这里:Service1.DbContext与众不同Service2.DbContext.
当我在ASP.NET MVC中的一个单独的线程中运行任务时,似乎为每个调用SimpleInjector创建一个新实例DbContext.虽然一些IoC库(例如StructureMap)对于每个web-per-webrequest具有混合生活方式,但似乎SimpleInjector没有一个.我对吗?
你有什么想法解决这个问题SimpleInjector吗?提前致谢.
编辑:
我的服务在这里:
class Service1 : IService1 {
public Service1(MyDbContext context) { }
}
class Service2 : IService2 {
public Service2(MyDbContext context, IService1 service1) { }
}
class SyncServiceUsage {
public SyncServiceUsage(Service2 service2) {
// use Service2 (and Service1 and …Run Code Online (Sandbox Code Playgroud) c# dependency-injection inversion-of-control simple-injector
使用简单的喷油器与下面介绍的命令模式和这里所描述的查询模式.对于其中一个命令,我有2个处理程序实现.第一个是同步执行的"正常"实现:
public class SendEmailMessageHandler
: IHandleCommands<SendEmailMessageCommand>
{
public SendEmailMessageHandler(IProcessQueries queryProcessor
, ISendMail mailSender
, ICommandEntities entities
, IUnitOfWork unitOfWork
, ILogExceptions exceptionLogger)
{
// save constructor args to private readonly fields
}
public void Handle(SendEmailMessageCommand command)
{
var emailMessageEntity = GetThisFromQueryProcessor(command);
var mailMessage = ConvertEntityToMailMessage(emailMessageEntity);
_mailSender.Send(mailMessage);
emailMessageEntity.SentOnUtc = DateTime.UtcNow;
_entities.Update(emailMessageEntity);
_unitOfWork.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
另一个就像一个命令装饰器,但显式包装前一个类在一个单独的线程中执行命令:
public class SendAsyncEmailMessageHandler
: IHandleCommands<SendEmailMessageCommand>
{
public SendAsyncEmailMessageHandler(ISendMail mailSender,
ILogExceptions exceptionLogger)
{
// save constructor args to private readonly fields
}
public …Run Code Online (Sandbox Code Playgroud) multithreading asynchronous dependency-injection entity-framework-4.1 simple-injector