在前十三节比较详尽和完整的讲述了nopCommerce应用程是怎样通过复杂的MVC配置服务,来调用数据库和生成数据中的表及其相关数据的。nopCommerce应用程同时也是通过一系列复杂的配置管道请求来实现页面的调用,下面将要讲述nopCommerce应用程是配置管道请求是怎样被定义的以及调用逻辑。
- 重构Nop.Web.Startup类中的方法:
public void Configure(IApplicationBuilder app)
{
app.ConfigureRequestPipeline();
//app.UseMvc(routes =>
//{
// routes.MapRoute(
// name: "default",
// template: "{controller=Setting}/{action=Create}/{id?}");
//});
}
- 添加Nop.Web.Framework.Infrastructure.Extensions.ApplicationBuilderExtensions类的定义。
- 在Nop.Core.Infrastructur.NopEngine、Nop.Core.Infrastructure.IEngine类和接口中添加public void ConfigureRequestPipeline(IApplicationBuilder application) 类的声明和定义。
- (1)、重构INopStartup接口,在该接口添加void Configure(IApplicationBuilder application)方法的声明。
(2)、重构Nop.Web.Framework.Infrastructure.NopDbStartup和Nop.Web.Framework.Infrastructure. NopMvcStartup类在这两个类中添加public void Configure(IApplicationBuilder application)方法的定义。
- 添加如图中所选择类的定义:
- 重构Nop.Web.Framework.Infrastructure.Extensions.ServiceCollectionExtensions类
(1)、添加方法public static TConfig ConfigureStartupConfig<TConfig>(this IServiceCollection services, IConfiguration configuration) where TConfig : class, new()。
(2)、在public static IServiceProvider ConfigureApplicationServices(this IServiceCollection services,
IConfiguration configuration, IHostingEnvironment hostingEnvironment)方法中,添加下列语句:
//添加nopconfig配置参数。
var nopConfig = services.ConfigureStartupConfig<NopConfig>(configuration.GetSection("Nop"));
//添加宿主配置参数。
services.ConfigureStartupConfig<HostingConfig>(configuration.GetSection("Hosting"));
(3)、public static IMvcBuilder AddNopMvc(this IServiceCollection services) 方法中,添加下列语句:
//我们使用传统的(来自以前版本的)路由逻辑.
mvcBuilder.AddMvcOptions(options => options.EnableEndpointRouting = false);
//添加流畅验证.
mvcBuilder.AddFluentValidation(configuration =>
{
//从nop程序集中注册所有可用的验证器。
var assemblies = mvcBuilder.PartManager.ApplicationParts
.OfType<AssemblyPart>()
.Where(part => part.Name.StartsWith("Nop", StringComparison.InvariantCultureIgnoreCase))
.Select(part => part.Assembly);
configuration.RegisterValidatorsFromAssemblies(assemblies);
//子属性的隐式/自动验证。
configuration.ImplicitlyValidateChildProperties = true;
});
7、重构Nop.Web.Framework.Infrastructure.DependencyRegistrar类
(1)、在 public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder)方法中,添加下列语句:builder.RegisterType<RoutePublisher>().As<IRoutePublisher>().SingleInstance();
8、按F5发现Nop.Web.Framework.Localization.LocalizedRoute类中的SeoFriendlyUrlsForLanguagesEnabled属性在执行_seoFriendlyUrlsForLanguagesEnabled = EngineContext.Current.Resolve<LocalizationSettings>().SeoFriendlyUrlsForLanguagesEnabled;语句时发生异常:System.NullReferenceException:“Object reference not set to an instance of an object.”
由于本程序的代码在2019-10-10_MyNopCommerce_VS19Core2.2Nop4.20(不删004_数据库映射、仓储及连接)的基础上进行重构,同时在Nop.Web.Framework.Mvc.Routing.RoutePublisher类中定义了public virtual void RegisterRoutes(IRouteBuilder routeBuilder)方法。
解决上述异常需要在Nop.Web.Framework.Infrastructure.DependencyRegistrar类
(1)、在 public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder)方法中,添加下列语句:
//注册所有设置
builder.RegisterSource(new SettingsSource());
(2)、Nop.Web.Framework.Infrastructure.DependencyRegistrar类添加public class SettingsSource : IRegistrationSource类的定义,先在Home/Index页面中的string str = "";语句中定义下端点,然后按F5发现上述异常已经被解决,同时Home/Index页面已经可以正常启动了,至此配置管道请求的所有代码和定义已经全部完成。
- 新详细的信息请见我所上传代码“2019-10-28_MyNopCommerce_VS19Core2.2Nop4.20(不删011_配置管道请求).rar。(https://download.csdn.net/download/zhoujian_911/11934505)”。