C# SimpleInjector在.Net MVC站点启动时引发间歇性错误
我有一个ASP.NET MVC,它在应用程序启动方法中初始化简单的注入器 该错误在本地正常使用站点期间间歇性出现,在Visual Studio中重建站点时始终消失。部署时,错误会立即出现,但可以通过在服务器上重新启动应用程序来消除。过了一会儿,它又出现了 启动代码如下所示:C# SimpleInjector在.Net MVC站点启动时引发间歇性错误,c#,asp.net,asp.net-mvc,simple-injector,C#,Asp.net,Asp.net Mvc,Simple Injector,我有一个ASP.NET MVC,它在应用程序启动方法中初始化简单的注入器 该错误在本地正常使用站点期间间歇性出现,在Visual Studio中重建站点时始终消失。部署时,错误会立即出现,但可以通过在服务器上重新启动应用程序来消除。过了一会儿,它又出现了 启动代码如下所示: public class CmsApplication : System.Web.HttpApplication { private Container _container; private IQueryP
public class CmsApplication : System.Web.HttpApplication
{
private Container _container;
private IQueryProcessor queryProcessor;
private static ISiteManager _manager;
public static ISiteManager SiteManager { get { return _manager; } }
protected virtual void Application_Start()
{
// Mapping using AutoMapper
CMS.UI.Client.Mapping.MappingConfig.RegisterMappings();
// Initialize SimpleInjector
InitializeIoC();
AutoMapper.Mapper.AssertConfigurationIsValid();
// Get query processor - this is used for handling database calls.
queryProcessor = _container.GetInstance<IQueryProcessor>();
// Get configuration
IConfiguration configuration = CMS.Configuration.ConfigurationFactory.Get();
// MVC Stuff
AreaRegistration.RegisterAllAreas();
RouteConfig routeConfig = new RouteConfig(queryProcessor);
routeConfig.RegisterRoutes(RouteTable.Routes);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
// Regular MVC startup
AreaRegistration.RegisterAllAreas();
// Global SiteManager property. THIS COULD BE CAUSING THE ISSUE!
_manager = _container.GetInstance<ISiteManager>();
}
/// <summary>
/// Method to initialize the IoC Container
/// </summary>
protected void InitializeIoC()
{
// Initialize DI container
_container = new Container();
// Allows container to inject into filter constructors
_container.RegisterMvcIntegratedFilterProvider();
// Mapping
_container.Register<AutoMapper.IMappingEngine>(() => (AutoMapper.IMappingEngine)AutoMapper.Mapper.Engine, Lifestyle.Singleton);
_container.Register<IMapProcessor, MapProcessor>(); // Map Processor
// Configuration
_container.Register<IConfiguration>(() => (CMS.Configuration.Configuration)System.Configuration.ConfigurationManager.GetSection("pipeline"), Lifestyle.Singleton);
// Site Manager
_container.Register<ISiteManager, SiteManager>(Lifestyle.Singleton);
// Context and UnitOfWork Factories
_container.RegisterPerWebRequest<IContext>(() => new CrmContext("Name=CrmContext"));
// Context and UnitOfWork
_container.RegisterPerWebRequest<Pipeline.Core.Data.UnitOfWork.IUnitOfWork, Crm.UnitOfWork.EFUnitOfWork>();
// Repositories
_container.Register<ISiteRepository, SiteRepository>();
_container.Register<IFolderRepository, FolderRepository>();
// Sitemap
_container.Register<ISitemapGenerator, SitemapGenerator>();
// Robots
_container.Register<IRobotsGenerator, RobotsGenerator>();
// Command Handlers
_container.RegisterOpenGeneric(
typeof(IBatchCommandHandler<>), typeof(BatchCommandHandler<>));
_container.RegisterManyForOpenGeneric(
typeof(ICommandHandler<>),
AppDomain.CurrentDomain.GetAssemblies());
_container.RegisterManyForOpenGeneric(
typeof(ICommandHandler<,>),
AppDomain.CurrentDomain.GetAssemblies());
// Validators
_container.RegisterManyForOpenGeneric(
typeof(IValidator<>),
AppDomain.CurrentDomain.GetAssemblies());
// Query Handlers
_container.RegisterManyForOpenGeneric(
typeof(IQueryHandler<,>),
AppDomain.CurrentDomain.GetAssemblies());
// Query Processor
_container.Register<IQueryProcessor>(() => new QueryProcessor(_container));
// Validation Decorators
_container.RegisterDecorator(typeof(ICommandHandler<,>),
typeof(ValidationCommandHandlerDecorator<,>),
c => typeof(ICommandHandler<,>)
.MakeGenericType(c.ServiceType.GetGenericArguments())
.IsAssignableFrom(c.ImplementationType));
// Verify the container
_container.Verify();
//// Register the container as MVC IDependencyResolver
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(_container));
}
var assemblies = new[]
{
typeof(SomeQueryHandlerImplementation).Assembly,
typeof(SqlRepository<>).Assembly,
};
// Simple Injector v3.x
_container.Register(typeof(ICommandHandler<>), assemblies);
_container.Register(typeof(ICommandHandler<,>), assemblies);
_container.Register(typeof(IValidator<>), assemblies);
_container.Register(typeof(IQueryHandler<,>), assemblies);
// Simple Injector v2.x
_container.RegisterManyForOpenGeneric(typeof(ICommandHandler<>), assemblies);
_container.RegisterManyForOpenGeneric(typeof(ICommandHandler<,>), assemblies);
_container.RegisterManyForOpenGeneric(typeof(IValidator<>), assemblies);
_container.RegisterManyForOpenGeneric(typeof(IQueryHandler<,>), assemblies);
公共类CMS应用程序:System.Web.HttpApplication
{
私家货柜;;
专用IQueryProcessor查询处理器;
专用静态ISiteManager_manager;
公共静态ISiteManager站点管理器{get{return}
受保护的虚拟无效应用程序\u Start()
{
//使用自动映射器进行映射
CMS.UI.Client.Mapping.MappingConfig.RegisterMappings();
//初始化SimpleInjector
初始化ioc();
AutoMapper.Mapper.AssertConfiguration验证();
//获取查询处理器-用于处理数据库调用。
queryProcessor=_container.GetInstance();
//获取配置
IConfiguration configuration=CMS.configuration.ConfigurationFactory.Get();
//MVC材料
RegisterAllAreas();
RouteConfig RouteConfig=新的RouteConfig(查询处理器);
routeConfig.RegisterRoutes(RouteTable.Routes);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
//常规MVC启动
RegisterAllAreas();
//全局SiteManager属性。这可能导致问题!
_manager=_container.GetInstance();
}
///
///方法初始化IoC容器
///
受保护的void InitializeIoC()
{
//初始化DI容器
_容器=新容器();
//允许容器注入过滤器构造函数
_container.RegisterMVIntegratedFilterProvider();
//映射
_container.Register(()=>(AutoMapper.IMappingEngine)AutoMapper.Mapper.Engine,lifety.Singleton);
_container.Register();//映射处理器
//配置
_container.Register(()=>(CMS.Configuration.Configuration)System.Configuration.ConfigurationManager.GetSection(“管道”)、lifety.Singleton);
//现场经理
_容器。登记(生活方式。单身);
//上下文和工作单元工厂
_container.registerWebRequest(()=>newcrmcontext(“Name=CrmContext”);
//上下文和工作单元
_container.registerWebRequest();
//存储库
_container.Register();
_container.Register();
//网站地图
_container.Register();
//机器人
_container.Register();
//命令处理程序
_container.RegisterOpenGeneric(
typeof(IBatchCommandHandler),typeof(BatchCommandHandler));
_container.RegisterManyForOpenGeneric(
类型(ICommandHandler),
AppDomain.CurrentDomain.GetAssemblys());
_container.RegisterManyForOpenGeneric(
类型(ICommandHandler),
AppDomain.CurrentDomain.GetAssemblys());
//验证器
_container.RegisterManyForOpenGeneric(
类型(IValidator),
AppDomain.CurrentDomain.GetAssemblys());
//查询处理程序
_container.RegisterManyForOpenGeneric(
类型(IQueryHandler),
AppDomain.CurrentDomain.GetAssemblys());
//查询处理器
_Register(()=>newqueryprocessor(_container));
//验证装饰器
_容器.注册表记录器(类型为(ICommandHandler),
类型(ValidationCommandHandlerDecorator),
c=>typeof(ICommandHandler)
.MakeGenericType(c.ServiceType.GetGenericArguments())
.IsAssignableFrom(c.ImplementationType));
//验证容器
_container.Verify();
////将容器注册为MVC IDependencyResolver
SetResolver(新的SimpleInjectDependencyResolver(_容器));
}
InitializeIoC
方法只是注册各种类型,没有什么特别之处
在InitializeIoC
方法之后,RouteConfig
调用使用通过SimpleInjector解析的类型来使用数据库调用。这似乎没有问题
当_manager字段设置为resolved type usesIQueryHandler
时,似乎会引发错误。SimpleInjector将ISiteManager设置为singleton,我不确定这是否是问题的根源
具体的处理程序肯定是存在的(因为它确实工作,错误是间歇性的)
我有点被难倒了
以下是错误和堆栈跟踪:
错误页
无法注册类型IQueryHandler
已找到。说明:测试期间发生未处理的异常
正在执行当前web请求。请查看堆栈跟踪
有关错误以及错误来源的详细信息,请参阅
代码
异常详细信息:SimpleInjector.ActivationException:否
类型IQueryHandler的注册可能是
找到了
源错误:
在执行过程中生成了未处理的异常
当前web请求。有关源和位置的信息
可以使用下面的异常堆栈跟踪来识别异常
堆栈跟踪:
[ActivationException:未注册类型
可以找到IQueryHandler。]SimpleInjector.Container.ThrowMissingInstanceProducerException(类型 serviceType)+136 SimpleInjector.Container.GetInstance(类型 服务类型)+76
Pipeline.Crm.Services.QueryProcessor.QueryProcessor.Pipeline.Core.Serv
_container.RegisterDecorator(typeof(ICommandHandler<,>),
typeof(ValidationCommandHandlerDecorator<,>));