我需要ASP.Net Core依赖注入将一些参数传递给我的GlobalRepository类的构造函数,该类实现ICardPaymentRepository接口.
参数用于配置,来自配置文件和数据库,我不希望我的类去引用数据库和配置本身.
我认为工厂模式是最好的方法,但我无法找出使用工厂类的最佳方法,工厂类本身依赖于配置和数据库.
我的创业公司目前看起来像这样
public class Startup
{
public IConfiguration _configuration { get; }
public IHostingEnvironment _environment { get; }
public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
_configuration = configuration;
_environment = environment;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IDbRepository, DbRepository>();
var connection = _configuration.GetConnectionString("DbConnection");
services.Configure<ConnectionStrings>(_configuration.GetSection("ConnectionStrings"));
services.AddDbContext<DbContext>(options => options.UseSqlServer(connection));
services.AddScoped<ICardPaymentRepository, GlobalRepository>();
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IRFDbRepository rFDbRepository)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
GlobalRepository构造函数如下所示:
public GlobalRepository(string mode, string apiKey)
{
}
Run Code Online (Sandbox Code Playgroud)
我现在如何将模式从配置和apiKey从DbRepository传递到Startup的构造函数中?
我正在使用 ASP.NET Core Identity 在我的网站上进行身份验证,并且我试图在用户登录后立即将用户 ID 记录到数据库中,但我似乎无法使用以下代码访问它们。此处返回GetResult()null,但如果它在下一页上,则它可以正常工作,但只是不在OnPostAsync它需要的方法中。
Input.UserIDOrLogonName不包含用户 ID。
private readonly SignInManager<User> _signInManager;
private readonly UserManager<User> _userManager;
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(Input.UserIDOrLogonName, Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
var userId = _userManager.GetUserAsync(HttpContext.User)
.GetAwaiter().GetResult().UserId;
_audit.RecordAction(AuditType.LoginSuccess, userId);
return LocalRedirect(returnUrl);
}
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以访问 User 实例吗?
我正在开发一个 .net 标准 C# 类库,每当我构建它时都会自动输出一个 NuGet 包。我正在使用这个带有 ASP.NET Core 应用程序的 NuGet 包。如果我在每次构建类库时更新它的版本号,我可以使用一个简单的 Update-Package 命令将更改拉入我的应用程序,但我不想每次都更改版本号,当我正在做很多小的改变。
我尝试清除 Visual Studio 选项菜单中的 NuGet 缓存,然后尝试使用“dotnet restore”以及卸载/重新安装,但不知何故,它似乎仍然从某个地方继续拉入旧版本。
有没有其他方法可以做到这一点?它会从哪里提取旧版本?
我将 ASP.NET Core 2.1 与 Microsoft Identity 一起使用,并且用户抱怨他们在仅大约 30 分钟不活动后就一直被重定向到登录屏幕。我在 ExpireTimeSpan 中设置了 60 分钟,但它永远不会持续那么长时间。有什么建议?
这是我在 Startup.cs 文件中的内容:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IRFDbRepository, RFDbRepository>();
var connection = _configuration.GetConnectionString("RFDbConnection");
services.Configure<ConnectionStrings>(_configuration.GetSection("ConnectionStrings"));
services.AddDbContext<IdentityDbContext>(options => options.UseSqlServer(connection));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddRazorPagesOptions(options =>
{
options.AllowAreas = true;
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
services.AddIdentity<User, UserRole>().AddDefaultTokenProviders();
services.AddTransient<IUserStore<User>, UserStore>();
services.AddTransient<IRoleStore<UserRole>, RoleStore>();
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Identity/Account/Login";
options.LogoutPath = "/Identity/Account/Logout";
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.SlidingExpiration = true;
});
}
Run Code Online (Sandbox Code Playgroud)
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IRFDbRepository rFDbRepository)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} …Run Code Online (Sandbox Code Playgroud) 我在模式弹出窗口中有一个反应式表单,但是当我第一次打开模式时,必填字段具有焦点。当我单击关闭按钮时,会触发验证(我认为是通过失去焦点),并显示所需的字段验证消息,但按钮不会单击即。按钮后面的代码不运行。如果你再次点击它,一切都会正常。
这些是 TS 文件的相关位:
ngOnInit() {
this.addPaymentForm = this.formBuilder.group({
jobId: ['', [Validators.required, Validators.maxLength(9)]],
grossAmount: ['', [Validators.required, Validators.max(10000), Validators.min(-10000)]]
});
}
get f() { return this.addPaymentForm.controls; }
close() {
this.activeModal.close({ dataModified: false });
}
Run Code Online (Sandbox Code Playgroud)
这是 HTML:
<form [formGroup]="addPaymentForm" (ngSubmit)="submit()">
<label for="jobId">Job Id</label>
<input type="number" id="jobId" class="form-control" formControlName="jobId" required>
<div *ngIf="f.jobId.invalid && (f.jobId.dirty || f.jobId.touched)" class="alert alert-danger mt-2">
<div *ngIf="f.jobId.errors.required">
Job Id is required
</div>
<div *ngIf="f.jobId.errors.maxlength">
Invalid Job Id
</div>
</div>
<label for="grossAmount">Gross Amount</label>
<input id="grossAmount" type="number" class="form-control" formControlName="grossAmount" required>
<div …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到一种更简洁的方法来执行以下查询,以便我不会复制我的代码.
SELECT CASE WHEN <COMPLICATED CODE THAT RETURNS A SINGLE INT> = 0
THEN 1
ELSE <COMPLICATED CODE THAT RETURNS A SINGLE INT> END
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望使用现有函数而不是创建自己的函数:
SELECT ISVALUE(COMPLICATED CODE THAT RETURNS A SINGLE INT,0,1)
Run Code Online (Sandbox Code Playgroud)