【发布时间】: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) +4862 参数)+71
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
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) +821.End() +143
System.Web.Mvc.Async.WrappedAsyncResultBase
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) +561.End() +143
System.Web.Mvc.Async.WrappedAsyncResultBase
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) +531.End() +140
System.Web.Mvc.Async.WrappedAsyncResultBase
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) +811.End() +140
System.Web.Mvc.Async.WrappedAsyncResultBase
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) +731.End() +140
System.Web.Mvc.Async.WrappedAsyncResultBase
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) +811.End() +140
System.Web.Mvc.Async.WrappedAsyncResultBase
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