热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单的注入器/IoC-队列处理器的Windows服务和请求周期

如何解决《简单的注入器/IoC-队列处理器的Windows服务和请求周期》经验,为你挑选了1个好方法。

我正在用C#编写一个队列处理器作为Windows服务.后端队列机制是MongoDB.队列的目的是运行源自我们主网站(Angular w Web API)的带外请求.对于每个排队的项目,我想要一个序列化的Command实例+序列化的上下文信息

foreach请求周期:
1)如果当前命令处理程序需要它,则新建DbContext(EF)
2)反序列化AppContext并将该信息注入当前的命令处理程序

不知道如何在Simple Injector中处理这些模式.特别是因为这是Timer的循环,而不是已经为其编写过helper/classes的Web Request.思考?我见过其他IoC容器过去使用lambda表达式来处理这类东西.只是不确定如何处理我的#1和#2场景.



1> Steven..:

每个定时器脉冲都可以被认为是新的请求.或者,如果您在一个脉冲中处理多个命令,则可以将每个命令视为新请求.

一些框架(如ASP.NET和WCF)具有请求(Web请求,WCF操作等)的概念,这允许Simple Injector插入框架的请求模型.因此,Simple Injector包含MVC,Web API和WCF的集成包.这些集成包挂钩到框架的请求模型中,这允许您注册每个请求实例而无需执行任何特殊操作.

但是,Windows服务不向我们提供此类基于请求的模型.这意味着您必须手动定义请求边界.这适用于所有DI容器; 不仅是简单的注射器.

Simple Injector包含两种不同的Lifestyles,允许您创建显式范围.这些是ThreadScopedLifestyle和AsyncScopedLifestyle.它ThreadScopedLifestyle是特定于线程的,而AsyncScopedLifestyle在处理异步操作时可以使用; 它允许范围流过异步方法调用.

提示:更喜欢使用AsyncScopedLifestyleover ThreadScopedLifestyle,因为它可以作为单线程操作进行异步操作.ThreadScopedLifestyle通常只应在运行.NET 4.0应用程序时使用,因为AsyncScopedLifestyle它仅适用于.NET 4.5,.NET Core和.NET Standard 1.3.

这意味着在从用于处理该命令的容器中解析新服务之前,必须在容器中启动新的"范围".例如:

public void ProcessCommand(object command) {
    using (AsyncScopedLifestyle.BeginScope(this.container)) {
        Type handlerType = 
            typeof(ICommandHandler<>).MakeGenericType(command.GetType());

        dynamic handler = container.GetInstance(handlerType);

        handler.Handle((dynamic)command);
    }
}

通过将操作包装在生命周期范围内,我们允许重用服务.我们可以通过以下方式注册它们来实现AsyncScopedLifestyle:

var cOntainer= new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

container.Register(Lifestyle.Scoped);

使用生命周期范围注册的服务将在该范围的持续时间内生效,并且在范围被处置时将被处置(在ProcessCommand方法结束时的示例中).


推荐阅读
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
author-avatar
对不起太依赖你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有