【问题标题】:NullReferenceException: Object reference not set to an instance of an object- NES.EventHandlerFactoryNullReferenceException:对象引用未设置为对象的实例 - NES.EventHandlerFactory
【发布时间】:2016-06-05 19:41:56
【问题描述】:

我的代码如下:

public class ConferenceService
    {
        private static readonly IEventFactory _eventFactory = DI.Current.Resolve<IEventFactory>();
        private static readonly IEventHandlerFactory _eventHandlerFactory = DI.Current.Resolve<IEventHandlerFactory>();
        private readonly string nameOrConnectionString;
        private readonly RetryPolicy<SqlAzureTransientErrorDetectionStrategy> retryPolicy;

        public ConferenceService(string nameOrConnectionString = "ConferenceManagement")
        {

            this.nameOrConnectionString = nameOrConnectionString;

            this.retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(new Incremental(5, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1.5)) { FastFirstRetry = true });
            this.retryPolicy.Retrying += (s, e) =>
                Trace.TraceWarning("An error occurred in attempt number {1} to access the database in ConferenceService: {0}", e.LastException.Message, e.CurrentRetryCount);

        }

        public void CreateConference(ConferenceInfo conference)
        {
            using (var context = new ConferenceContext(this.nameOrConnectionString))
            {
                var existingSlug = this.retryPolicy.ExecuteAction(() => 
                    context.Conferences
                        .Where(c => c.Slug == conference.Slug)
                        .Select(c => c.Slug)
                        .Any());

                if (existingSlug)
                    throw new DuplicateNameException("The chosen conference slug is already taken.");

                // Conference publishing is explicit. 
                if (conference.IsPublished)
                    conference.IsPublished = false;

                context.Conferences.Add(conference);
                this.retryPolicy.ExecuteAction(() => context.SaveChanges());

               this.PublishConferenceEvent<ConferenceCreated>(conference);
            }
        }


        private void PublishConferenceEvent<T>(ConferenceInfo conference)
            where T : ConferenceEvent, new()
        {

            Action<T> action = x => new T
            {
                SourceId = conference.Id,
                Owner = new Owner
                {
                    Name = conference.OwnerName,
                    Email = conference.OwnerEmail,
                },
                Name = conference.Name,
                Description = conference.Description,
                Location = conference.Location,
                Slug = conference.Slug,
                Tagline = conference.Tagline,
                TwitterSearch = conference.TwitterSearch,
                StartDate = conference.StartDate,
                EndDate = conference.EndDate,
            };

            Apply(action);
        }


        private void Apply<TEvent>(Action<TEvent> action)
        {
           var @event = _eventFactory.Create(action);
           Raise(@event);
        }

        private void Raise(object @event)
        {
            _eventHandlerFactory.Get(this, @event.GetType())(@event);
        }
    }

但是当我运行我的代码并尝试创建一个会议时,它会显示以下异常消息:

对象引用未设置为对象的实例。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.NullReferenceException:没有对象引用 设置为对象的实例。

来源错误:

第 10 行:公共类 EventHandlerFactory:IEventHandlerFactory 第 11 行:{ 第 12 行:私有静态只读 ILogger Logger = LoggerFactory.Create(typeof(EventHandlerFactory));第 13 行:私有静态只读 Dictionary>> _cache = new Dictionary>>();第 14 行:私人 静态只读对象 _cacheLock = new object();

源文件: F:\MyProjects\NES\NES-master\src\NES\EventHandlerFactory.cs 行: 12

堆栈跟踪:

[NullReferenceException: 对象引用未设置为 对象。] NES.EventHandlerFactory..cctor() 在 F:\MyProjects\NES\NES-master\src\NES\EventHandlerFactory.cs:12

[TypeInitializationException: 的类型初始化器 “NES.EventHandlerFactory”引发了异常。]
NES.EventHandlerFactory..ctor() +0 NES.c.<.cctor>b__4_4() 在 F:\MyProjects\NES\NES-master\src\NES\DI.cs:24
NES.DependencyInjectionContainer.Resolve() 在 F:\MyProjects\NES\NES-master\src\NES\DependencyInjectionContainer.cs:21 Conference.ConferenceService..cctor() 在 F:\MyProjects\NES\NES-master\samples\Conference\ConferenceService.cs:23

[TypeInitializationException: 的类型初始化器 “Conference.ConferenceService”引发了异常。]
Conference.ConferenceService..ctor(String nameOrConnectionString) in F:\MyProjects\NES\NES-master\samples\Conference\ConferenceService.cs:36 Conference.Web.Admin.Controllers.ConferenceController.get_Service() 在 F:\MyProjects\NES\NES-master\samples\Conference.Web.Admin\Controllers\ConferenceController.cs:32 Conference.Web.Admin.Controllers.ConferenceController.Create(ConferenceInfo 会议)在 F:\MyProjects\NES\NES-master\samples\Conference.Web.Admin\Controllers\ConferenceController.cs:119 lambda_method(闭包, ControllerBase, Object[]) +180
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器,Object[] 参数)+68
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext 控制器上下文,IDictionary2 parameters) +486
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 参数)+71
System.Web.Mvc.Async.ActionInvocation.InvokeSynchronousActionMethod() +85 System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +44
System.Web.Mvc.Async.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult) +82
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End() +143
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+109
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult 异步结果)+58
System.Web.Mvc.Async.AsyncInvocationWithFilters.b__3d() +121 System.Web.Mvc.Async.c__DisplayClass46.b__3f() +321 System.Web.Mvc.Async.c__DisplayClass33.b__32(IAsyncResult asyncResult) +53
System.Web.Mvc.Async.WrappedAsyncResult1.CallEndDelegate(IAsyncResult asyncResult) +56
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End() +143
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+109
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult 异步结果)+58
System.Web.Mvc.Async.c__DisplayClass2b.b__1c() +76 System.Web.Mvc.Async.c__DisplayClass21.b__1e(IAsyncResult 异步结果)+184
System.Web.Mvc.Async.WrappedAsyncResult1.CallEndDelegate(IAsyncResult asyncResult) +53
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End() +140
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+63
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +50
System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +45
System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +81
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End() +140
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+63
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+47
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +50 System.Web.Mvc.Controller.b__15(IAsyncResult asyncResult,控制器控制器)+50
System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +73
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End() +140
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+63
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+47 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +50
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +50
System.Web.Mvc.MvcHandler.b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +45
System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +81
System.Web.Mvc.Async.WrappedAsyncResultBase
1.End() +140
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+63
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, 对象标签)+47
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +50 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果)+49
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9644037 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

【问题讨论】:

  • EventHandlerFactory.cs中的构造函数是什么样的?错误发生在其构造函数的第 12 行。

标签: cqrs


【解决方案1】:

问题已解决。问题是由于配置引起的。最后,我通过在 Global.asax 的 Application_Start() 方法中添加以下代码行来解决此问题。

LogManager.Use<NServiceBus.Log4Net.Log4NetFactory>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2020-11-17
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多