第六节 事件发布
在执行nopCommerce_4.10应用程序时,如果与数据库发生数据交换(包含插入、修改、删除)时,产生错误,则触发事件发布机制,事件发布负责把错误信息写入数据库中的日志表。
- 修改Service.Configuration.SettingService类中的InsertSetting方法为:
/// <summary>
/// 【插入设置】
/// <param name="setting">一个设置实体实例</param>
/// <param name="clearCache">指示在设置更新之后是否清除缓存,默认值--true;不查找--flase;查找--ture。</param>
/// <remarks>
/// 摘要:
/// 插入一个指定设置实体实例到数据库相应的表中。
/// </remarks>
/// </summary>
public virtual void InsertSetting(Setting setting, bool clearCache = true)
{
_settingRepository.Insert(setting);
//事件通知
_eventPublisher.EntityInserted(setting);
}
2、修改Service.Configuration.SettingService类中的拷贝构造方法方法为:
/// <summary>
/// 【拷贝构造方法】
/// <param name="eventPublisher">事件发布实例。</param>
/// <param name="settingRepository">设置仓储实例。</param>
/// <remarks>
/// 摘要:
/// 对该类中的一些对象的实例,进行初始化操作。
/// </remarks>
/// </summary>
public SettingService(IEventPublisher eventPublisher, IRepository<Setting> settingRepository)
{
this._eventPublisher = eventPublisher;
this._settingRepository = settingRepository;
}
3、在Service.Configuration.SettingService类中添加以下变量定义:
/// <summary>
/// 【事件发布实例】
/// <remarks>
/// 摘要:
/// 该保护变量,它被声明后,并被拷贝构造方法初始化。
/// </remarks>
/// </summary>
private readonly IEventPublisher _eventPublisher;
4、添加Events、Logging定义最终效果如图1-10:
图1-10
5、添加Common、Customers、Logging和Events定义最终效果如图1-11:
图1-11
6、添加Customers和Logging定义最终效果如图1-12:
图1-12
在Framework.Infrastructure.DependencyRegistrar.Register方法中添加以下定义语句:
//日志。
builder.RegisterType<DefaultLogger>().As<ILogger>().InstancePerLifetimeScope();
//配置。
builder.RegisterType<EventPublisher>().As<IEventPublisher>().SingleInstance();
builder.RegisterType<SubscriptionService>().As<ISubscriptionService>().SingleInstance();
7、按F5执行程序时在Core.Infrastructure.NopEngine protected IServiceProvider GetServiceProvider()方法中的var context = accessor.HttpContext;语句时会出现异常:System.NullReferenceException:“Object reference not set to an instance of an object.”原因是:
没有对accessor实例为null。
解决方案:
(1)、在Framework.Infrastructure.Extensions.ServiceCollectionExtensions类中添加下面方法定义;
/// <summary>
/// 【添加Http上下文访问器】
/// <param name="services">服务集合实例。</param>
/// <remarks>
/// 摘要注册 HttpContextAccessor。
/// </remarks>
/// </summary>
public static void AddHttpContextAccessor(this IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
(2)、在Framework.Infrastructure.Extensions.ServiceCollectionExtensions类 public static IServiceProvider ConfigureApplicationServices(this IServiceCollection services, IConfiguration configuration) 方法中添加语句:services.AddHttpContextAccessor();
8、按F5执行程序.
到此为止事件发布已经完成,至于更新详细的信息请见我所上传代码“MyNopCommerce(不删,005_事件发布)。 (https://download.csdn.net/download/zhoujian_911/10802390)”中的“日志”与“.vsdx”文件。