/// <summary> /// 使用微信登陆。 /// </summary> /// <param name="app"></param> /// <param name="configureOptions"></param> /// <returns></returns> public static SchubertWebBuilder AddWeChatSignIn(this SchubertWebBuilder app, Action <WeChatOptions> configureOptions = null) { WeChatOptions options = new WeChatOptions(); configureOptions?.Invoke(options); return(app.ConfigureServices(s => s.AddAuthentication().AddOAuth <WeChatOptions, WeChatOAuthHandler>(WeiboDefaults.AuthenticationScheme, WechatDefaults.DisplayName, configureOptions))); }
/// <summary> /// 为 MVC 添加 FluentValidation 支持。 /// </summary> /// <param name="builder"></param> public static void AddFluentValidationForMvc(this SchubertWebBuilder builder) { if (builder.AddedModules.Add(_module)) { builder.AddStarter(new FluentValidationStarter()); } }
/// <summary> /// 启动基于 Schubert 引擎的 Web 应用程序。 /// </summary> /// <param name="builder"></param> /// <returns></returns> public static IApplicationBuilder StartSchubertWebApplication(this IApplicationBuilder builder) { builder.ApplicationServices.StartSchubertEngine(); //启动引擎,为我们动态注册服务,创建 Shell 上下文。 IOptions <SchubertWebOptions> options = builder.ApplicationServices.GetService <IOptions <SchubertWebOptions> >(); if (options != null && options.Value != null) { foreach (var s in _webBuilder.WebStarters) { s.Start(builder, options.Value); } var moduleManager = builder.ApplicationServices.GetRequiredService <IModuleManager>(); builder.UseStaticFiles(); builder.UseAuthentication(); if (options.Value.UseSession) { builder.UseSession(); } if (options.Value.MvcFeatures != MvcFeatures.None) { builder.UseMvc(); } } //尽可能节省内存,让GC可以回收 WebBuilder _webBuilder = null; return(builder); }
/// <summary> /// 使用QQ登陆。 /// </summary> /// <param name="app"></param> /// <param name="configureOptions"></param> /// <returns></returns> public static SchubertWebBuilder AddQQSignIn(this SchubertWebBuilder app, Action <QQOAuthOptions> configureOptions = null) { QQOAuthOptions options = new QQOAuthOptions(); configureOptions?.Invoke(options); return(app.ConfigureServices(s => s.AddAuthentication().AddOAuth <QQOAuthOptions, QQOAuthHandler>(QQDefaults.AuthenticationScheme, QQDefaults.DisplayName, configureOptions))); }
public static SchubertWebBuilder AddWebApiConventions(this SchubertWebBuilder builder) { //builder.Services.TryAddEnumerable( // ServiceDescriptor.Transient<IConfigureOptions<MvcOptions>, WebApiCompatShimOptionsSetup>()); //builder.Services.TryAddEnumerable( // ServiceDescriptor.Transient<IConfigureOptions<WebApiCompatShimOptions>, WebApiCompatShimOptionsSetup>()); //builder.Services.TryAddSingleton<IContentNegotiator, DefaultContentNegotiator>(); //return builder; builder.ConfigureServices(services => services.TryAddEnumerable(ServiceDescriptor.Transient <IConfigureOptions <MvcOptions>, ApiOptionsSetup>())); return(builder); }
private static void AddMvc(SchubertServicesBuilder services, SchubertWebBuilder featureBuilder, SchubertWebOptions options) { Action <MvcOptions> configure = mvc => { if (!options.GlobalRoutePrefix.IsNullOrWhiteSpace()) { mvc.Conventions.Insert(0, new RoutePrefixConvention(new RouteAttribute(options.GlobalRoutePrefix.Trim()))); } }; switch (options.MvcFeatures) { case MvcFeatures.Full: var mvcBuilder = services.ServiceCollection.AddMvc(configure); featureBuilder.MvcSetup?.Invoke(mvcBuilder); mvcBuilder.AddJsonOptions(json => json.SerializerSettings.ContractResolver = GetContractResolver(options.JsonCaseStyle, options.JsonResolver)) .AddRazorOptions(rveo => { rveo.FileProviders.Insert(0, new ModuleFileProvider(rveo.FileProviders.FirstOrDefault())); rveo.ViewLocationExpanders.Insert(0, new ModuleViewLocationExpander()); }); //services.ServiceCollection.AddAntiforgery(); break; case MvcFeatures.Core: var coreBuilder = services.ServiceCollection.AddMvcCore(configure); featureBuilder.MvcCoreSetup?.Invoke(coreBuilder); break; case MvcFeatures.Api: var apiBuilder = services.ServiceCollection.AddMvcCore(configure); featureBuilder.MvcCoreSetup?.Invoke(apiBuilder); apiBuilder.AddApiExplorer() .AddAuthorization() .AddFormatterMappings() .AddJsonFormatters(settings => settings.ContractResolver = GetContractResolver(options.JsonCaseStyle, options.JsonResolver)) .AddDataAnnotations() .AddCors(); featureBuilder.AddWebApiConventions(); break; default: return; } }
/// <summary> /// 加入 Asp.Net Identity ,同时使用 Dapper 持久化存储。 /// </summary> /// <typeparam name="TUser">用户类型。</typeparam> /// <typeparam name="TRole">角色类型。</typeparam> /// <typeparam name="TIdentityService"><see cref="IIdentityService"/></typeparam> /// <param name="builder"></param> /// <param name="configure"></param> /// <returns></returns> public static SchubertWebBuilder AddIdentityWithDapperStores <TUser, TRole, TIdentityService>(this SchubertWebBuilder builder, Action <IdentityOptions> configure = null) where TUser : UserBase where TRole : RoleBase where TIdentityService : IIdentityService { if (builder.AddedModules.Add(_module)) { builder.AddStarter(new DapperIdentityStarter <TUser, TRole, TIdentityService>(configure)); } return(builder); }
/// <summary> /// 启用Schubert 框架的 Web 特性。 /// </summary> /// <param name="services"></param> /// <param name="setup">加入 Mvc 支持。</param> /// <returns></returns> public static SchubertServicesBuilder AddWebFeature(this SchubertServicesBuilder services, Action <SchubertWebBuilder> setup = null) { SchubertWebOptions options = new SchubertWebOptions(); bool firstInvoke = true; if ((firstInvoke = services.AddedModules.Add(_module))) { IConfiguration configuration = services.Configuration.GetSection("Schubert:Web") as IConfiguration ?? new ConfigurationBuilder().Build(); services.ServiceCollection.Configure <SchubertWebOptions>(configuration); var schubertWebSetup = new SchubertWebOptionsSetup(configuration); schubertWebSetup.Configure(options); } _webBuilder = new SchubertWebBuilder(services); setup?.Invoke(_webBuilder); if (_webBuilder.FeatureSetup != null) { services.ServiceCollection.Configure(setup); } _webBuilder.FeatureSetup?.Invoke(options); services.ServiceCollection.AddDataProtection(); services.ServiceCollection.AddLocalization(); services.ServiceCollection.Replace(ServiceDescriptor.Singleton <IStringLocalizerFactory, SchubertStringLocalizerFactory>()); services.ServiceCollection.TryAddSingleton <IMemoryCache>(s => LocalCache.InnerCache); services.AddCacheForAspNet(); var cookieSetup = _webBuilder.CookieSetup; services.ServiceCollection.ConfigureApplicationCookie(o => { o.LoginPath = "/Login"; o.LogoutPath = "/LogOff"; o.Cookie.HttpOnly = true; o.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; cookieSetup?.Invoke(o); }); var authenticationBuilder = services.ServiceCollection.AddAuthentication(); if (options.UseCookieAuth) { authenticationBuilder.AddCookie(); } if (options.UseSession) { services.ServiceCollection.AddSession(sop => { sop.IdleTimeout = TimeSpan.FromMinutes(options.SessionTimeoutMinutes); }); } services.ServiceCollection.AddSmart(SchubertWebServices.GetServices(options, firstInvoke)); foreach (var s in _webBuilder.WebStarters) { s.ConfigureServices(services, options); } AddMvc(services, _webBuilder, options); return(services); }