2017-02-05 32 views
5

Tìm kiếm câu trả lời từ kiến ​​trúc sư cấp cao ASP.NET, người biết chi tiết bên trong của ASP.NET MVC.Lấy tài liệu tham khảo của đối tượng Startup.cs

Đây là bộ khung của ứng dụng lõi ASP.NET tiêu chuẩn.

var config = new ConfigurationBuilder() 
    .AddCommandLine(args) 
    .AddEnvironmentVariables(prefix: "ASPNETCORE_") 
    .Build(); 

var host = new WebHostBuilder() 
    .UseConfiguration(config) 
    .UseKestrel() 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
    .UseIISIntegration() 
    .UseStartup<Startup>() 
    .Build(); 

host.Run(); 

Trong phần này bộ máy ASP.NET instantiates một thể hiện của lớp Startup.cs

.UseStartup<Startup>() 

truy vấn của tôi là làm thế nào tôi có thể có được giữ (tham khảo) này dụ đã khởi tạo của Startup đối tượng mà tôi có thể cắm vào Thư viện/Khung của tôi.

Bối cảnh là thiết lập một số khuôn khổ cấp Uber và tham khảo đường giao nhau này (Startup.cs), nơi tất cả các yêu cầu được bắt đầu.

Trả lời

10

Nếu Startup cụ của bạn IStartup giao diện, nhận được tham chiếu đến nó rất dễ dàng:

var host = new WebHostBuilder() 
.UseConfiguration(config) 
.UseKestrel() 
.UseContentRoot(Directory.GetCurrentDirectory()) 
.UseIISIntegration() 
.UseStartup<Startup>() 
.Build(); 

var startup = host.Services.GetService(typeof(IStartup)); // or from any other part of code using IServiceProvider. 

Tuy nhiên, asp.net lõi không đòi hỏi lớp khởi động của bạn để thực hiện giao diện này. Nếu không - nó sẽ sử dụng mẫu bộ điều hợp và điều chỉnh lớp Startup của bạn thành giao diện IStartup. Bạn vẫn sẽ có một phiên bản của IStartup, nhưng nó sẽ không phải là lớp học Startup của bạn. Thay vào đó, nó sẽ là một phiên bản của ConventionBasedStartup. Asp.net lõi sẽ khám phá các phương pháp của lớp học khởi động của bạn, tìm các phương pháp ConfigureConfigureServices và sẽ chuyển chúng đến ConventionBasedStartup, chúng sẽ thích ứng với giao diện IStartup. Trong trường hợp này, bạn không thể truy xuất cá thể của lớp khởi động mà không phản ánh nặng vì nó không thực sự được lưu trữ trong bất kỳ trường nào (ngay cả ở chế độ riêng tư) của ConventionBasedStartup và chỉ có thể truy cập thông qua các tham chiếu đại biểu.

Tóm tắt câu chuyện dài - nếu bạn muốn có được ví dụ về lớp Startup của bạn - hãy thực hiện giao diện IStartup.

Cập nhật về cách triển khai giao diện IStartup:

public class Startup : IStartup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     // constructor as usual 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
      .AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    public void Configure(IApplicationBuilder app) {    
     app.UseMvc(); 
     // resolve services from container 
     var env = (IHostingEnvironment) app.ApplicationServices.GetService(typeof(IHostingEnvironment)); 
     var logger = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory)); 
     logger.AddConsole(Configuration.GetSection("Logging")); 
     logger.AddDebug(); 
     // etc 
    }   

    public IServiceProvider ConfigureServices(IServiceCollection services) { 
     services.AddMvc(); 
     // etc 
     // return provider 
     return services.BuildServiceProvider(); 
    } 
} 
+0

Cảm ơn, điều này dường như hứa hẹn, tôi đã thêm 'IStartup' như một giao diện để lớp 'Startup', nó phàn nàn cho' ConfigureServices' kiểu trả về, câu hỏi là những gì tôi nên trở lại trong 'ConfigureServices' để phù hợp với yêu cầu của giao diện' IStartup', tôi mới vào .net. – user2727195

+0

@ user2727195 câu trả lời được cập nhật với một ví dụ. – Evk

+0

Cảm ơn, mã phòng thu trực quan đang phàn nàn về một số phụ thuộc, ví dụ 'ConfigurationBuilder' và' IConfigurationRoot'. Tôi đã tạo ra một ứng dụng web đơn giản nhất trên nền xương trần bằng cách sử dụng máy phát điện 'yo aspnet'. Bạn muốn thực hiện đơn giản nhất ở cấp độ 'Startup.cs' vì việc nâng hạng nặng sẽ được thực hiện trong khuôn khổ của tôi. Ngoài ra tôi không muốn cắm vào 'mvc' của' asp.net mvc' kể từ khi tôi đã thực hiện tùy chỉnh của riêng tôi. Ở mức độ rất đơn giản, tôi muốn đối tượng Startup chỉ để 'delegate' các yêu cầu gửi đến khung của tôi. – user2727195

Các vấn đề liên quan