NetCore 2.0 MVC入门之 Startup 配置
2019独角兽企业重金招聘Python工程师标准>>>
刚接触netcore, 以下我正在使用的配置说明以及需要注入的几点
1.我在项目中因为不想使用构造函数注入,所以我引用了第三方的Autofac包来管理我的service,在controller中只需要 创建 public iClass class{get;set;}即可
2.service注入我采用的是dll反射进行注入,
注意如下代码 var files = System.IO.Directory.GetFiles(AppContext.BaseDirectory, "*.BLL.dll"); 由于我的业务层都放在BLL中,所以我只需要搜索根目录下的BLL文件进行注入即可
3. 项目中如果使用了Areas ,需要添加以下代码
app.UseMvc(routes =>{routes.MapRoute(name: "areaRoute",template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");//控制器分层
如果需要将areas单独建成项目,需要在ConfigureServices(IServiceCollection services)中如下代码,该代码是将子项目中的controller注入到主项目中
#region mvc 区域分项目时调用var manager = new ApplicationPartManager();files = System.IO.Directory.GetFiles(AppContext.BaseDirectory, "*.Web.dll");//获取所有的web.dllif (files != null && files.Length > 0){foreach (var file in files){manager.ApplicationParts.Add(new AssemblyPart(Assembly.LoadFrom(file)));}}manager.FeatureProviders.Add(new ControllerFeatureProvider());var feature = new ControllerFeature();manager.PopulateFeature(feature);#endregion
在子项目中属性 ---》生成事件----》后期生成事件中添加如下代码
mkdir "$(SolutionDir)$(SolutionName).Web\Areas\{AreaName}\Views"
xcopy "$(ProjectDir)Views" "$(SolutionDir)$(SolutionName).Web\Areas\{AreaName}\Views" /S /E /C /Y
public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }public Autofac.IContainer ApplicationContainer;// This method gets called by the runtime. Use this method to add services to the container.public IServiceProvider ConfigureServices(IServiceCollection services){services.Configure<CookiePolicyOptions>(options =>{// This lambda determines whether user consent for non-essential cookies is needed for a given request.options.CheckConsentNeeded = context => true;options.MinimumSameSitePolicy = SameSiteMode.None;});//读取配置文件ApplicationEnvironments.Site = Configuration.GetSection("SiteConfig").Get<SiteConfig>();//httpcontext 如果在dll层需要用到httpContext则需要使用方法services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();//属性注入services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());services.AddMvc(config => {config.Filters.Add<CustomExceptionFilter>();})//全局配置Json序列化处理.AddJsonOptions(options =>{//忽略循环引用options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;//不使用驼峰样式的keyoptions.SerializerSettings.ContractResolver = new DefaultContractResolver();设置时间格式//options.SerializerSettings.DateFormatString = "yyyy-MM-dd";}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddSessionStateTempDataProvider();#region //身份认证时需要使用的方法services.AddSession(options=> {options.Cookie.HttpOnly = true;options.Cookie.Name = ApplicationEnvironments.Site.CookieName;options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;options.IdleTimeout = TimeSpan.FromMinutes(ApplicationEnvironments.Site.SessionTimeout);});services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>{options.DataProtectionProvider= DataProtectionProvider.Create(new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory+ "/shared-auth-ticket-keys/"));options.Cookie.Name = ApplicationEnvironments.Site.CookieName;options.Cookie.Path = "/";options.LoginPath = new PathString("/login");options.AccessDeniedPath = new PathString("/Forbidden"); //禁止访问路径:当用户试图访问资源时,但未通过该资源的任何授权策略,请求将被重定向到这个相对路径。// options.SlidingExpiration = false; //Cookie可以分为永久性的和临时性的。 临时性的是指只在当前浏览器进程里有效,浏览器一旦关闭就失效(被浏览器删除)。 永久性的是指Cookie指定了一个过期时间,在这个时间到达之前,此cookie一直有效(浏览器一直记录着此cookie的存在)。 slidingExpriation的作用是,指示浏览器把cookie作为永久性cookie存储,但是会自动更改过期时间,以使用户不会在登录后并一直活动,但是一段时间后却自动注销。也就是说,你10点登录了,服务器端设置的TimeOut为30分钟,如果slidingExpriation为false,那么10:30以后,你就必须重新登录。如果为true的话,你10:16分时打开了一个新页面,服务器就会通知浏览器,把过期时间修改为10:46。 更详细的说明还是参考MSDN的文档。});#endregionApplicationEnvironments.DefaultSession = new BaseController();//数据库驱动注入if (ApplicationEnvironments.Site.IsUseEF){services.AddScoped<IDbRepository, EFRepository>();}else{services.AddScoped<IDbRepository, AdoRepository>();}//缓存注入if (ApplicationEnvironments.Site.IsUseRedis){services.AddSingleton<ICacheService,RedisService>();}else{services.AddSingleton<ICacheService,MemoryService>();}//service 层注入var files = System.IO.Directory.GetFiles(AppContext.BaseDirectory, "*.BLL.dll");if (files != null && files.Length > 0){foreach (var file in files){foreach (var item in GetClassName(file)){foreach (var typeArray in item.Value){services.AddScoped(typeArray, item.Key);}}}}#region AutoFac 属性注入 var builder = new Autofac.ContainerBuilder();builder.Populate(services);#region mvc 区域分项目时调用var manager = new ApplicationPartManager();files = System.IO.Directory.GetFiles(AppContext.BaseDirectory, "*.Web.dll");//获取所有的web.dllif (files != null && files.Length > 0){foreach (var file in files){manager.ApplicationParts.Add(new AssemblyPart(Assembly.LoadFrom(file)));}}manager.FeatureProviders.Add(new ControllerFeatureProvider());var feature = new ControllerFeature();manager.PopulateFeature(feature);#endregion//采用属性注入控制器builder.RegisterTypes(feature.Controllers.Select(ti => ti.AsType()).ToArray()).PropertiesAutowired();this.ApplicationContainer = builder.Build();return new AutofacServiceProvider(this.ApplicationContainer);#endregion//跨域访问//services.AddCors(options => options.AddPolicy("AllowSameDomain", builder => builder.WithOrigins("http://a.local.com:50307", "http://b.local.com:63455")));//跨域认证时使用此项//services.AddCors(options => options.AddPolicy("AllowSameDomain", builder => builder.WithOrigins("http://a.local.com:50307", "http://b.local.com:63455").AllowCredentials()));}private static Dictionary<Type, Type[]> GetClassName(string assemblyName){if (!String.IsNullOrEmpty(assemblyName)){Assembly assembly = Assembly.LoadFrom(assemblyName);List<Type> ts = assembly.GetTypes().ToList();var result = new Dictionary<Type, Type[]>();foreach (var item in ts.Where(s => !s.IsInterface)){var interfaceType = item.GetInterfaces();if (item.IsGenericType) continue;result.Add(item, interfaceType);}return result;}return new Dictionary<Type, Type[]>();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){//app.UseBrowserLink();//app.UseDeveloperExceptionPage();ApplicationEnvironments.IsDevelopment = true;}else{//app.UseExceptionHandler("/Home/Error");//app.UseHsts();ApplicationEnvironments.IsDevelopment = false;}app.UseHttpsRedirection();app.UseStaticFiles();//app.UseSpaStaticFiles();app.UseCookiePolicy();app.UseSession();app.UseAuthentication();app.UseExceptionHandler("/Home/Error");//错误处理//app.UseErrorHandling();app.UseMvc(routes =>{routes.MapRoute(name: "areaRoute",template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");//控制器分层routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");});//添加httpcontext类AppHttpContext.Configure(app.ApplicationServices.GetRequiredService<Microsoft.AspNetCore.Http.IHttpContextAccessor>());//nginx反向代理app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});app.UseAuthentication();app.UseStatusCodePages();//使用HTTP错误代码页}}
转载于:https://my.oschina.net/u/3049482/blog/2964907
NetCore 2.0 MVC入门之 Startup 配置相关推荐
- Asp.Net Core 6.0 Mvc入门 图书查询系统 附带源码下载
Asp.Net Core 6.0 MVC 入门 简介 目标 第一章 创建Asp.Net Core Web应用 第二章 从Model开始 第三章 Model之后皆基架 第四章 运行应用 第五章 数据搜索 ...
- 最全的 netcore 3.0 升级实战方案
1.哈喽大家中秋节(后)好呀!感觉已经好久没有写文章了,但是也没有偷懒哟,我的视频教程<系列一.NetCore 视频教程(Blog.Core)>也已经录制八期了,还在每周末同步更新中,欢迎 ...
- .Netcore 2.0 Ocelot Api网关教程(8)- 缓存
Ocelot中使用 CacheManager 来支持缓存,官方文档中强烈建议使用该包作为缓存工具. 以下介绍通过使用CacheManager来实现Ocelot缓存. 1.通过Nuget添加 Ocelo ...
- ASP.NET MVC入门到精通——Spring.net-业务层仓储
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...
- Entity Framework Core 2.0 使用入门
本文转载自作者:晓晨Master(李志强) 原文章地址 https://www.cnblogs.com/stulzq/p/7717873.html 一.前言 Entity Framework(后面简称 ...
- Castle Active Record for .NET2.0快速入门示例
一.创建Web工程 创建一个Web站点或者Web应用程序,添加对Castle.ActiveRecord.dll的引用. 二.创建需要持久化的业务实体 在.NET2.0下,由于引入了泛型,创建业务实体比 ...
- Spring MVC 入门--Hello World
Spring MVC 学习 Hello world 步骤 添加jar包 在web.xml文件中配置DispatcherServlet 添加Spring MVC的配饰文件 编写处理请求的处理器,并且标识 ...
- 如何:从Spring 4.0快速入门以构建简单的REST-Like API(演练)
如何:从Spring 4.0快速入门以构建简单的REST-Like API(演练) 关于使用Spring MVC创建Web API的另一篇教程. 不太复杂. 只是一个演练. 生成的应用程序将提供简单的 ...
- springmvc的主要功能_Spring MVC入门
今天开始我们对Spring MVC框架的入门介绍,如果说是基础入门我们会先给大家介绍如下几个技术内容 理解Spring MVC工作流程 快速搭建Spring MVC 详细介绍@RequestMappi ...
最新文章
- hle机器人_《英雄联盟》Deft加入HLE打野CaD续约Arthur加入
- php缓存mysql表_PHP 中的数据库缓存原理
- 如何查看某个端口被谁占用
- MySQL中用decimal的原因
- Hardware assisted virtualization and data execution protection must be enabled in the BIOS
- MYSQL错误: ERROR 1205: Lock wait timeout exceeded(处理MYSQL锁等待)解决办法
- spring依赖注入的基本方法及其原理
- Oracle11 startup报错,oracle11g 启动报错 缺少系统参数
- excel if函数 android,Excel函数公式:多条件判断你还在用If函数来实现,那就真的Out了...
- 【Docker】Mac下Docker启动Kubernetes处于一直启动中(卡死)
- 使用cxf3.0.4搭建webservice服务需要的最精简jar包
- OLED原理,时序和操作
- 触动精灵贝塞尔曲线Bezier Curve
- 2018年中高级前端面试题目小结
- CLR via C#:与WinRT组件互操作
- ESP32定时器睡眠模式
- 忆阻器交叉开关阵列中的长短期记忆(LSTM)神经网络
- 华为防火墙(usg5500)区域间实验
- Oracle数据库-第三章:单值函数
- chrome浏览器调试JS代码
热门文章
- Linux网络监控工具--netstat及网络连接分析
- log_bin.index not found 启动报错解决
- 驰骋工作流程引擎案例-水质检测工作流程设计开发实现过程
- mysql installer图解_MySQL Installer GUI - 图解
- 编程难学?3点解答你的疑惑
- python程序员总结的一些基本语法
- win10装linux grub,在Win10下安装Ubuntu14.04安装并修复grub2
- python 遍历字符串的每一个字符_Python之字符串的遍历的4种方式
- hibernate保存会先insert再update_Hibernate的批处理
- JavaScript 中 call、apply和bind的用法区别