Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SimpleInjector在.Net MVC站点启动时引发间歇性错误_C#_Asp.net_Asp.net Mvc_Simple Injector - Fatal编程技术网

C# SimpleInjector在.Net MVC站点启动时引发间歇性错误

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

我有一个ASP.NET MVC,它在应用程序启动方法中初始化简单的注入器

该错误在本地正常使用站点期间间歇性出现,在Visual Studio中重建站点时始终消失。部署时,错误会立即出现,但可以通过在服务器上重新启动应用程序来消除。过了一会儿,它又出现了

启动代码如下所示:

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 uses
IQueryHandler
时,似乎会引发错误。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<,>));