我創建了一個 asp.net 6 最小 API 專案,并將其結構如下:
程式.cs
using WebApplication1.EndPointExtension;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointDefinitions(typeof(IEndpointDefinition));
var app = builder.Build();
app.UseEndpointDefinitions();
if (builder.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
IEndpointDefinition.cs
public interface IEndpointDefinition
{
void DefineServices(IServiceCollection services);
void DefineEndpoints(WebApplication app);
}
端點定義.cs
public static class EndpointDefinitionExtensions
{
public static void AddEndpointDefinitions(
this IServiceCollection services, params Type[] scanMarkers)
{
var endpointDefinitions = new List<IEndpointDefinition>();
foreach (var marker in scanMarkers)
{
endpointDefinitions.AddRange(
marker.Assembly.ExportedTypes
.Where(x => typeof(IEndpointDefinition).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
.Select(Activator.CreateInstance).Cast<IEndpointDefinition>());
}
foreach (var endpointDefinition in endpointDefinitions)
{
endpointDefinition.DefineServices(services);
}
services.AddSingleton(endpointDefinitions as IReadOnlyCollection<IEndpointDefinition>);
}
public static void UseEndpointDefinitions(this WebApplication app)
{
var definitions = app.Services.GetRequiredService<IReadOnlyCollection<IEndpointDefinition>>();
foreach (var endpointDefinition in definitions)
{
endpointDefinition.DefineEndpoints(app);
}
}
}
下面是我的 DB Context 類,它實作了端點介面并繼承了核心身份類 DatabaseDBContext.cs
public class DatabaseDBContext : IdentityDbContext, IEndpointDefinition
{
public DatabaseDBContext(DbContextOptions<DatabaseDBContext> options) : base(options)
{
}
public void DefineEndpoints(WebApplication app)
{
app.UseAuthentication();
}
public void DefineServices(IServiceCollection services)
{
services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<DatabaseDBContext>();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connectionString = configuration.GetConnectionString("AppDb");
if (!optionsBuilder.IsConfigured)
optionsBuilder.UseSqlServer(connectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
我已經安裝了遷移所需的 NuGet 包并在 appsetting.js 中提供了連接字串,但是當我構建專案時,它顯示的錯誤為
System.MissingMethodException: '無法動態創建型別為 'WebApplication1.DatabaseDBContext' 的實體。原因:沒有定義無引數建構式
我想知道到底哪里出錯了,或者我沒有使用正確的方法。
uj5u.com熱心網友回復:
經過這么多次嘗試解決它,我只是顯式呼叫了默認建構式
public DatabaseDBContext()
{
}
它奏效了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/366424.html
