api - .net Core 3 / API / DI / 存储库模式
问题描述
我正在尝试在 .net Core 中创建一个 Web API。我希望这个 API 调用一个在其中实现了存储库设计模式的 DLL。在整个过程中,我尝试使用依赖注入,但在管理存储库中数据库的上下文时遇到了一些问题。
我希望在调用 API 的每个生命周期中使用一个新的上下文。
当我尝试执行我的代码时,我在 CreateHostBuilder(args).Build().Run(); 行出现异常 在主要。
这个例外是:
“无法构造某些服务” InvalidOperationException:尝试激活“BX_Security_AccessBase.Repository.UsersRepository”时,无法解析“BX_Security_AccessBase.Context.SecurityContext”类型的服务。
我知道代码不完整并且不能完全工作,但至少它应该比实际更晚。我想我在架构上犯了一个错误。
下面有很多代码,但我无法隔离我的问题。
谢谢大家。
在我的 API 中,我有:
启动.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<IUsersRepository, UsersRepository>();
services.AddScoped<IUserService, UserService>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
用户.cs
public class User
{
public User() {}
public int UserId { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public DateTime Birthdate { get; set; }
}
用户服务.cs
public class UserService : IUserService
{
private readonly AppSettings _appSettings;
private readonly IUsersRepository _userRepository;
public UserService(IOptions<AppSettings> appSettings, IUsersRepository userRepository)
{
_appSettings = appSettings.Value;
_userRepository = userRepository;
}
public IEnumerable<User> GetAll()
{
return _userRepository.GetAllUsers().Select(u=> new User());
}
}
用户服务.cs
public interface IUserService
{
public IEnumerable<User> GetAll();
}
应用设置.cs
public class AppSettings
{
public string Secret { get; set; }
}
用户控制器.cs
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
private IUserService _userService { get; }
public UsersController(IUserService userService)
{
_userService = userService;
}
[HttpGet]
public IActionResult GetAll()
{
var users = _userService.GetAll();
return Ok(users);
}
}
在 DLL 中我有:
安全上下文.cs
public partial class SecurityContext : DbContext
{
public SecurityContext(DbContextOptions<SecurityContext> options) : base(options) { }
public DbSet<Users> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Data Source=; Database=BXDB; User Id=sa; Password=;");
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Users>(entity =>
{
entity.HasKey(e => e.UserId).HasName("PK_User_UserId");
entity.ToTable("Users", "sec");
entity.Property(e => e.Birthdate).HasColumnType("date");
entity.Property(e => e.FirstName)
.HasMaxLength(50)
.IsUnicode(false);
entity.Property(e => e.LastName)
.HasMaxLength(50)
.IsUnicode(false);
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
用户.cs
public class Users
{
public Users() { }
public int UserId { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public DateTime Birthdate { get; set; }
}
IUsersRepository.cs
public interface IUsersRepository
{
public IQueryable<Users> GetAllUsers();
}
用户存储库.cs
public class UsersRepository : IUsersRepository
{
public readonly SecurityContext _dbContext;
public UsersRepository(SecurityContext dbContext)
{
_dbContext = dbContext;
}
public IQueryable<Users> GetAllUsers()
{
return _dbContext.Users;
}
}
解决方案
“无法构造某些服务” InvalidOperationException:尝试激活“BX_Security_AccessBase.Repository.UsersRepository”时,无法解析“BX_Security_AccessBase.Context.SecurityContext”类型的服务。
从错误中,您应该将 DbContext 注册为服务,如下所示:
public void ConfigureServices(IServiceCollection services)
{
var connection = @"Server=(localdb)\mssqllocaldb;Database=BXDB;Trusted_Connection=True;ConnectRetryCount=0";
services.AddDbContext<DLL.Models.SecurityContext>(options => options.UseSqlServer(connection, x => x.MigrationsAssembly("DLL")));
services.AddControllers();
services.AddScoped<IUsersRepository, UsersRepository>();
services.AddScoped<IUserService, UserService>();
}
推荐阅读
- r - 从列表中的向量中提取元素名称
- java - 如何在基于休眠的 dao 实现中减少 bioler 板代码
- scala - 使用类型类使 OpenGL 的 int 常量类型安全
- gdal - 使用 gdalbuildvrt 和 gdaltranslate 在 geotiff 边缘之间的水平伪影
- android - Altbeacon 2.16.1 无法扫描具有特定信标类型代码的信标
- javascript - 错误所有浏览器,但 Firefox 尝试使用 d3.js 更改背景图像
- xml - SAP ABAP:读取 XML 文档时忽略命名空间
- c# - 自定义控件的属性只能由 StaticResource 填充,不能用 XAML 中定义的值填充
- c# - 如何删除生成的 SOAP 信封中的前缀?
- javascript - 使用 Firebase Cloud Function 增加新用户的实时数据库计数