相关疑难解决方法(0)

Castle.Windsor生活方式取决于具体情况?

我有一个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

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

使用简单注入器的每线程和每Web请求的混合生活方式

SimpleInjector用作我的IoC库.我DbContext根据网络请求注册,它工作正常.但是我有一个任务是在后台线程中运行它.所以,我有一个问题来创建DbContext实例.例如

  1. Service1 有一个实例 DbContext
  2. Service2 有一个实例 DbContext
  3. Service1Service2从后台线程运行.
  4. Service1 获取实体并将其传递给 Service2
  5. Service2 使用该实体,但实体与之分离 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

14
推荐指数
1
解决办法
5780
查看次数

Simpleinjector:当我有2个实现并想要选择一个时,这是RegisterManyForOpenGeneric的正确方法吗?

使用简单的喷油器与下面介绍的命令模式这里所描述的查询模式.对于其中一个命令,我有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

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