Я следую учебнику для изучения ASP.NET CORE MVC. Учебник основан на ASP.NET Core 5, тогда как я использую ASP.NET Core 6.
Я уже сделал файл startup.cs с помощью этого туториала, но теперь мне нужно использовать файл program.cs, как это было раньше (в ASP.NET Core 5). Как я могу изменить файл program.cs, чтобы он был похож на файл в ASP.NET Core 5, или есть другой способ использовать код?
Код, который я хочу реализовать в program.cs:
using system;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using LIBRARY.Data;
using LIBRARY.Models;
using LIBRARY;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace Library.MVC
{
public class Program
{
public async static Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
var loggerFactory = services.GetRequiredService<ILoggerFactory>();
try
{
var context = services.GetRequiredService<ApplicationDbContext>();
var userManager = services.GetRequiredService<UserManager<ApplicationUser>>();
var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();
await ContextSeed.SeedRolesAsync(userManager, roleManager);
}
catch (Exception ex)
{
var logger = loggerFactory.CreateLogger<Program>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Мой файл startu.cs:
using LIBRARY.Data;
using LIBRARY.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using System.Configuration;
namespace LIBRARY
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; set; }
public static WebApplication InitializeApp(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
ConfigureServices(builder);
var app = builder.Build();
Configure(app);
return app;
}
//
//
private static void ConfigureServices(WebApplicationBuilder builder)
{
//var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
//builder.Services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlServer(connectionString));
//builder.Services.AddDatabaseDeveloperPageExceptionFilter();
//builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
// .AddEntityFrameworkStores<ApplicationDbContext>();
//builder.Services.AddControllersWithViews();
builder.Services.AddDbContext<ApplicationDbContext>(options => { options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); });
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
}
private static void Configure(WebApplication app)
{
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
}
}
}
И когда я помещаю код программы.cs в файл программы.cs и запускаю его. Это дает следующее исключение:
В чем проблема и как я могу ее решить?
Уточните, пожалуйста, какие версии ASP.NET вы используете — ASP.NET MVC 5 определенно отличается от ASP.NET CORE 5 MVC!
Привет, @Moaz Haroon, я проверил предоставленный вами учебник. Этот код предназначен только для заполнения данных в базе данных. Существует множество способов заполнения данных в .Net 6. Из-за этого вам не нужно изменять структуру вашего проекта. . Если вам нужен метод заполнения данных в .net 6, я могу его предоставить.
Пожалуйста, предоставьте один. @XinranShen





Добавить метод
Public void Configure(IApplicationBuilder, IWebHostingEnvironment){
// your logic goes here
}
Это обязательно для приложений ASP.
Ваша ссылка устарела [aspnetcore-3.0] и не соответствует запрошенной версии. Пожалуйста, отредактируйте свой ответ на запрашиваемую версию
Это никогда не было обязательным. Даже Startup не был обязательным. Это удобный класс с методами, используемыми для настройки промежуточного программного обеспечения, такого как конфигурация и DI. Вы можете настроить каждое промежуточное ПО отдельно, если хотите.
Хорошо, я обновлю свой вопрос. Но не могли бы вы рассказать об этом немного подробнее? Где я должен сделать функцию настройки и какую логику я должен в нее заложить? Если вы можете сказать мне из моего кода, какую часть я должен добавить в конфигурацию? Я новичок в С# и ASP.NET.
Вам просто нужно немного изменить код в своем проекте вместо изменения структуры проекта. Пожалуйста, обратитесь к этой простой демонстрации.
метод сеялки:
public static class ContextSeed
{
public static async Task SeedRolesAsync(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)
{
//Seed Roles
await roleManager.CreateAsync(new IdentityRole(Enums.Roles.SuperAdmin.ToString()));
await roleManager.CreateAsync(new IdentityRole(Enums.Roles.Admin.ToString()));
await roleManager.CreateAsync(new IdentityRole(Enums.Roles.Moderator.ToString()));
await roleManager.CreateAsync(new IdentityRole(Enums.Roles.Basic.ToString()));
}
}
Затем в вашей программе.cs
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
//.......................
var app = builder.Build();
await Configure(app);
// Configure the HTTP request pipeline.
//other middleware......
app.Run();
static async Task Configure(WebApplication host)
{
using var scope = host.Services.CreateScope();
var services = scope.ServiceProvider;
try
{
var dbContext = services.GetRequiredService<ApplicationDbContext>();
var userManager = services.GetRequiredService<UserManager<ApplicationUser>>();
var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();
await ContextSeed.SeedRolesAsync(userManager, roleManager);
}
catch (Exception ex)
{
//Log some error
throw;
}
}
Теперь, когда вы запустите свой проект, он загрузит данные в вашу базу данных.
Привет @Moaz Haroon, может ли этот метод помочь вам решить проблему?
нет, это не помогло мне решить проблему. Теперь у меня другая проблема в
var dbContext = services.GetRequiredService<ApplicationDbContext>();
System.InvalidOperationException: «Служба для типа« LIBRARY.Data.ApplicationDbContext »не зарегистрирована».
Есть ли способ связаться с вами? Я хотел бы полностью объяснить, с какими проблемами я сталкиваюсь.
Вы можете предоставить свою текущую программу.cs?
Я проверяю предоставленный вами файл. Пожалуйста, восстановите исходную структуру проекта (не используйте startup.cs, только program.cs) и добавьте код, который я предоставил выше.
В разделе «добавление настраиваемых полей для идентификации пользователя». Я должен изменить функцию ConfigureServices. Как мне сделать эту часть без создания файла startup.cs?
Я решил эту проблему. Переделав файл program.cs. Спасибо, @Xinran Shen.
Здравствуйте, Моаз Харун. Вы забыли добавить ключевое слово await перед ключевым словом async.