浏览代码

Integrating Ninject.Web.AspNetCore

Lukas Angerer 5 年之前
父节点
当前提交
e858b47508
共有 5 个文件被更改,包括 47 次插入16 次删除
  1. 7 1
      CronAlarm.sln
  2. 4 0
      CronAlarm/CronAlarm.csproj
  3. 0 2
      CronAlarm/Pages/Index.razor
  4. 25 8
      CronAlarm/Program.cs
  5. 11 5
      CronAlarm/Startup.cs

+ 7 - 1
CronAlarm.sln

@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 16
 VisualStudioVersion = 16.0.30711.63
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CronAlarm", "CronAlarm\CronAlarm.csproj", "{7E64081D-B278-4DA4-8936-9993A53E9C19}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CronAlarm", "CronAlarm\CronAlarm.csproj", "{7E64081D-B278-4DA4-8936-9993A53E9C19}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ninject.Web.AspNetCore", "H:\development\Ninject\Ninject.Web.AspNetCore\src\Ninject.Web.AspNetCore\Ninject.Web.AspNetCore.csproj", "{5B8D8AA8-81ED-4800-9580-0A24B9646368}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +17,10 @@ Global
 		{7E64081D-B278-4DA4-8936-9993A53E9C19}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{7E64081D-B278-4DA4-8936-9993A53E9C19}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{7E64081D-B278-4DA4-8936-9993A53E9C19}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5B8D8AA8-81ED-4800-9580-0A24B9646368}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5B8D8AA8-81ED-4800-9580-0A24B9646368}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5B8D8AA8-81ED-4800-9580-0A24B9646368}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5B8D8AA8-81ED-4800-9580-0A24B9646368}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 4 - 0
CronAlarm/CronAlarm.csproj

@@ -10,4 +10,8 @@
     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.9" />
   </ItemGroup>
 
+  <ItemGroup>
+    <ProjectReference Include="H:\development\Ninject\Ninject.Web.AspNetCore\src\Ninject.Web.AspNetCore\Ninject.Web.AspNetCore.csproj" />
+  </ItemGroup>
+
 </Project>

+ 0 - 2
CronAlarm/Pages/Index.razor

@@ -3,5 +3,3 @@
 <h1>Hello, world!</h1>
 
 Welcome to your new app.
-
-<SurveyPrompt Title="How is Blazor working for you?" />

+ 25 - 8
CronAlarm/Program.cs

@@ -1,5 +1,8 @@
 using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Hosting;
+using Ninject;
+using Ninject.Web.AspNetCore;
+using Ninject.Web.AspNetCore.Hosting;
+using Ninject.Web.Common.SelfHost;
 
 namespace CronAlarm
 {
@@ -7,14 +10,28 @@ namespace CronAlarm
     {
         public static void Main(string[] args)
         {
-            CreateHostBuilder(args).Build().Run();
+            var hostConfiguration = new AspNetCoreHostConfiguration(args)
+                    .UseStartup<Startup>()
+                    .UseKestrel()
+                    .BlockOnStart();
+
+            var host = new NinjectSelfHostBootstrapper(CreateKernel, hostConfiguration);
+            host.Start();
         }
 
-        public static IHostBuilder CreateHostBuilder(string[] args) =>
-            Host.CreateDefaultBuilder(args)
-                .ConfigureWebHostDefaults(webBuilder =>
-                {
-                    webBuilder.UseStartup<Startup>();
-                });
+        public static IKernel CreateKernel()
+        {
+            var settings = new NinjectSettings();
+            // Unfortunately, in .NET Core projects, referenced NuGet assemblies are not copied to the output directory
+            // in a normal build which means that the automatic extension loading does not work _reliably_ and it is
+            // much more reasonable to not rely on that and load everything explicitly.
+            settings.LoadExtensions = false;
+
+            var kernel = new AspNetCoreKernel(settings);
+
+            kernel.Load(typeof(AspNetCoreHostConfiguration).Assembly);
+
+            return kernel;
+        }
     }
 }

+ 11 - 5
CronAlarm/Startup.cs

@@ -3,12 +3,15 @@ using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
+using Ninject.Web.AspNetCore;
+using Ninject.Web.AspNetCore.Hosting;
 
 namespace CronAlarm
 {
-    public class Startup
+    public class Startup : AspNetCoreStartupBase
     {
-        public Startup(IConfiguration configuration)
+        public Startup(IConfiguration configuration, IServiceProviderFactory<NinjectServiceProviderBuilder> providerFactory)
+        : base(providerFactory)
         {
             Configuration = configuration;
         }
@@ -17,15 +20,18 @@ namespace CronAlarm
 
         // This method gets called by the runtime. Use this method to add services to the container.
         // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
-        public void ConfigureServices(IServiceCollection services)
+        public override void ConfigureServices(IServiceCollection services)
         {
             services.AddRazorPages();
             services.AddServerSideBlazor();
         }
 
-        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
-        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+        public override void Configure(IApplicationBuilder app)
         {
+            // For simplicitly, there is only one overload of Configure supported, so in order to get the additional
+            // services, you can just resolve them with the service provider.
+            var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
+
             if (env.IsDevelopment())
             {
                 app.UseDeveloperExceptionPage();