- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从我的应用程序中提取 Asp.Net Core Identity 以尊重 清洁架构 .
目前,我的项目分为 4 个项目:WebApi、Infrastructure、Application 和 Core。我希望将 Asp.Net EF Core 和 Asp.Net Core Identity 的所有配置封装到 Infrastructure 项目中。通过应用程序项目中定义的一些接口(interface)(例如 IApplicationDbcontext
、IUserService
、ICurrentUserService
),这两个服务都将暴露给 WebApi 项目。
不幸的是,我无法使用包管理器命令创建迁移:Add-Migration -Project src\Infrastructure -StartupProject src\WebApi -OutputDir Persistence\Migrations "SmartCollaborationDb_V1"
.
错误:Unable to create an object of type 'ApplicationDbContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
.
你能帮助我吗?
解决方案结构
src\WebApi\Startup.cs
public class Startup {
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration) {
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services) {
services.AddApplication(Configuration);
services.AddInfrastructure(Configuration);
services.AddHttpContextAccessor();
...
services.AddScoped<ICurrentUserService, CurrentUserService>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
...
}
}
src\Infrastructure\DependencyInjection.cs
public static class DependencyInjection {
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration config) {
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
config.GetConnectionString("DefaultConnection"),
context => context.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName)));
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<IApplicationDbContext>(provider => provider.GetService<ApplicationDbContext>());
services.AddTransient<IDateTimeService, DateTimeService>();
services.AddTransient<IUserService, UserService>();
return services;
}
}
src\Infrastructure\Persistence\ApplicationDbContext.cs
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>, IApplicationDbContext {
private readonly ICurrentUserService currentUserService;
private readonly IDateTimeService dateTimeService;
public DbSet<Student> Students { get; set; }
public DbSet<Group> Groups { get; set; }
public DbSet<Course> Courses { get; set; }
public ApplicationDbContext(
DbContextOptions options,
ICurrentUserService currentUserService,
IDateTimeService dateTimeService) :
base(options) {
this.currentUserService = currentUserService;
this.dateTimeService = dateTimeService;
}
protected override void OnModelCreating(ModelBuilder builder) {
builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
base.OnModelCreating(builder);
}
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default) {
UpdateAuditableEntities();
return base.SaveChangesAsync(cancellationToken);
}
private void UpdateAuditableEntities() {
foreach (var entry in ChangeTracker.Entries<AuditableEntity>()) {
switch (entry.State) {
case EntityState.Added:
entry.Entity.CreatedBy = currentUserService.UserId.ToString();
entry.Entity.Created = dateTimeService.Now;
break;
case EntityState.Modified:
entry.Entity.LastModifiedBy = currentUserService.UserId.ToString();
entry.Entity.LastModified = dateTimeService.Now;
break;
}
}
}
}
编辑#01
public class CurrentUserService : ICurrentUserService {
public Guid UserId { get; }
public bool IsAuthenticated { get; }
public CurrentUserService(IHttpContextAccessor httpContextAccessor) {
var claim = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
IsAuthenticated = claim != null;
UserId = IsAuthenticated ? Guid.Parse(claim) : Guid.Empty;
}
}
最佳答案
您的代码应该(并且确实)通常可以正常工作,并且不需要 IDesignTimeDbContextFactory<DbContext>
派生类。
我上传了 minimal project到 GitHub,它模仿您的设计,并且可以使用以下包管理器控制台命令毫无问题地创建迁移:Add-Migration -Project "Infrastructure" -StartupProject "WebApi" -OutputDir Persistence\Migrations "Initial"
从这往哪儿走
先来看看Design-time DbContext Creation , 了解 EF Core 如何寻找您的 DbContext
派生类。
然后把 Debugger.Launch()
(和 Debugger.Break()
)指令,在执行 Add-Migration
时触发 JIT 调试器命令。
最后,单步执行您的代码。确保您的 DependencyInjection.AddInfrastructure()
, ApplicationDbContext.ApplicationDbContext()
, ApplicationDbContext.OnModelCreating()
等方法按预期调用。
您可能还希望在调试时让您的 IDE 中断任何引发的异常。
您的问题可能与与 EF Core 完全无关的事情有关,在可以实例化上下文之前就出错了。好像不是CurrentUserService
构造函数,但它可能是 IDateTimeService
的构造函数实现类或在初始化过程中运行的其他东西。
您应该能够在单步抛出代码时找出答案。
更新:问题和解决方案
正如预期的那样,该问题与 EF Core 无关。 AddFluentValidation()
方法抛出以下异常:
System.NotSupportedException: The invoked member is not supported in a dynamic assembly.
at at System.Reflection.Emit.InternalAssemblyBuilder.GetExportedTypes()
at FluentValidation.AssemblyScanner.FindValidatorsInAssembly(Assembly assembly) in /home/jskinner/code/FluentValidation/src/FluentValidation/AssemblyScanner.cs:49
at FluentValidation.ServiceCollectionExtensions.AddValidatorsFromAssembly(IServiceCollection services, Assembly assembly, ServiceLifetime lifetime) in /home/jskinner/code/FluentValidation/src/FluentValidation.DependencyInjectionExtensions/ServiceCollectionExtensions.cs:48
at FluentValidation.ServiceCollectionExtensions.AddValidatorsFromAssemblies(IServiceCollection services, IEnumerable`1 assemblies, ServiceLifetime lifetime) in /home/jskinner/code/FluentValidation/src/FluentValidation.DependencyInjectionExtensions/ServiceCollectionExtensions.cs:35
at FluentValidation.AspNetCore.FluentValidationMvcExtensions.AddFluentValidation(IMvcBuilder mvcBuilder, Action`1 configurationExpression) in /home/jskinner/code/FluentValidation/src/FluentValidation.AspNetCore/FluentValidationMvcExtensions.cs:72
at WebApi.Startup.ConfigureServices(IServiceCollection services) in E:\Sources\SmartCollaboration\WebApi\Startup.cs:52
at at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(Object instance, IServiceCollection services)
at at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass9_0.<Invoke>g__Startup|0(IServiceCollection serviceCollection)
at at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.Invoke(Object instance, IServiceCollection services)
at at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass8_0.<Build>b__0(IServiceCollection services)
at at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services)
at at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass12_0.<UseStartup>b__0(HostBuilderContext context, IServiceCollection services)
at at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
at at Microsoft.Extensions.Hosting.HostBuilder.Build()
处理此问题的一种方法是仅检测是否从 EF Core 工具调用代码,并仅设置必要的服务,如果是这样的话:
public void ConfigureServices(IServiceCollection services)
{
Debugger.Launch(); // <-- Remove this after debugging!
services.AddApplication(Configuration);
services.AddInfrastructure(Configuration);
services.AddScoped<ICurrentUserService, CurrentUserService>();
if (new StackTrace()
.GetFrames()
.Any(f => f?.GetMethod()?.DeclaringType?.Namespace == "Microsoft.EntityFrameworkCore.Tools"))
{
// Called by EF Core design-time tools.
// No need to initialize further.
return;
}
services.AddSwaggerGen(options => {
options.SwaggerDoc("v1", new OpenApiInfo {
Version = "v1",
Title = "SmartCollaboration API"
});
options.AddFluentValidationRules();
});
services.AddHttpContextAccessor();
services.AddControllers().AddFluentValidation(options =>
options.RegisterValidatorsFromAssemblies(AppDomain.CurrentDomain.GetAssemblies()));
}
关于c# - 整洁架构和 Asp.Net 核心标识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62865530/
我正在使用这种代码: document.write("foo 使用 HTML tidy 后,表格外的 script 标签被移除,因此破坏了页面布局。我
我正在为我的网格系统使用 Bourbon 的 Neat 库。 我有这样的代码: section { @include outer-container; aside { @include spa
我有三个文件。 header.php index.php footer.php 头文件包含来自至 索引文件包含页面内容页脚文件包含 至 它们一起包含一个带有 PHP 的普通 HTML 文件 当我使用
我有一个格式有点乱的 Objective-C 代码库。有没有办法让 Xcode 重新格式化整个项目以符合编码标准(即正确缩进、空格与制表符等)?是否有其他工具可以完成此任务? 最佳答案 去壳化:htt
我试图自己实现整洁,使用原始论文但被卡住了。 假设在上一代我有以下物种: Specie 1: members: 100 avg_score: 100 Specie 2: memb
我正在尝试整理我的一些 SKScene 代码。目前我有大约 11 个对 SKNode 的引用(有些是包含子节点的层)。这些节点及其子节点被类频繁访问。我考虑这样做的方式是: 将所有 SKNode 子类
Notepad++ 的 HTML Tidy 坏了吗?除了 Tidy(第一个)之外,所有命令都不起作用。他们不显示任何消息,即使选择了所有文本。我真的需要 Tidy 才能工作,还是它只是最新版本 N++
有没有一种方法可以不使用 rowwise() 来创建 key? 非常感谢任何指针。 df % rowwise %>% mutate(key=paste(sort(c(grp1, grp2)), col
我正在尝试使用作为 PHP (http://www.php.net/manual/en/book.tidy.php) 一部分的 HTML Tidy 实现来重新格式化大量 HTML。我遇到了一个问题,其
我为 Sublime Text 2 安装了 phptidy 插件,并尝试用它来清理一些丑陋的代码,比如 $tdt="
我在 Windows 的命令行环境中使用 HTML Tidy。我需要强制将一些 html 文件转换为 xml,即使有错误也是如此。 我执行以下步骤: 创建文件“conf.txt”,其内容为: 强制输出
我正在重写一个使用 Bourbon 的“旧”React 原型(prototype),它还在 gulpfile 中使用 gulp-sass 来注入(inject)节点整洁的依赖项: var sassOp
我正在创建一个供个人使用的 jQuery Accordion 插件。 我的主要目标是拥有 super 简洁的 JS 代码和 HTML 结构。 这就是我已经走了多远 http://jsfiddle.ne
我正在测试 Bourbon Neat,我在一个外容器中有两列,我希望这些列的高度相等(与最高的列一样高)。在短列上使用 @include fill-parent 不起作用,它只会使它与外部容器一样宽。
大多数时候在 repos 中,我们看到一个 PR,然后是那个 PR 的 merge 提交,它只是说“Merged pull request #XXX from ...”。 但最近,我看到了一个紧凑的版
我正在使用 Neat 的 12 列网格。该页面由延伸整个网格宽度的部分组成。部分背景与页面背景不同: 如您所见,粉红色部分的左侧与网格边缘齐平。我想要的是该部分的左侧超出网格几个雷姆。 但是,如果我添
只是出于好奇而提出的简单问题。 类上的多个方法需要使用字符串流,或者特别是 ostringstream。 1) 有一个 stringstream 变量作为类成员,然后在使用它之前清除它,即 msg.s
我是波旁/整洁的新手。我有一个关于嵌套的问题:我希望红色框填充整个宽度,而彼此之间不要有排水沟。当在其上使用“@include omega”时,第一个框将删除其右边距,但是右边的框仍具有边距,并且不会
GWT(Google Web Toolkit)是否有一个功能可以漂亮地打印小部件的 html 输出? (如果问题措辞不当,我深表歉意——我不是 GWT 开发人员,但我们的开发人员声称没有办法做到这一点
我是一名优秀的程序员,十分优秀!