【问题标题】:.net Core 3 / API / DI / Repository pattern.net Core 3 / API / DI / 存储库模式
【发布时间】:2020-04-03 14:32:14
【问题描述】:

我正在尝试在 .net Core 中创建一个 Web API。我希望这个 API 调用一个在其中实现了存储库设计模式的 DLL。在整个过程中,我尝试使用依赖注入,但在管理存储库中数据库的上下文时遇到了一些问题。

我希望在 API 调用的每个生命周期中使用一个新的上下文。

当我尝试执行我的代码时,我在 CreateHostBuilder(args).Build().Run(); 行出现异常在 Main。

这个例外是:

'某些服务无法构建' InvalidOperationException:尝试激活“BX_Security_AccessBase.Repository.UsersRepository”时,无法解析“BX_Security_AccessBase.Context.SecurityContext”类型的服务。

我知道代码不完整并且不能完全工作,但至少它应该比实际更晚。我认为我在架构上犯了一个错误。

下面有很多代码,但我无法找出我的问题。

谢谢大家。

在我的 API 中有:

Startup.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());
    }
}

IUserService.cs

public interface IUserService
{
    public IEnumerable<User> GetAll();
}

AppSettings.cs

 public class AppSettings
{
    public string Secret { get; set; }
}

UsersController.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 中:

SecurityContext.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);
}

Users.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();
}

UsersRepository.cs

public class UsersRepository : IUsersRepository
{
    public readonly SecurityContext _dbContext;

    public UsersRepository(SecurityContext dbContext)
    {
        _dbContext = dbContext;
    }

    public IQueryable<Users> GetAllUsers()
    {
        return _dbContext.Users;
    }
}

【问题讨论】:

    标签: api asp.net-core dependency-injection repository


    【解决方案1】:

    “无法构建某些服务”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>();
     }
    

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 2020-03-05
      • 1970-01-01
      • 2022-10-18
      • 2012-01-27
      • 2021-09-05
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多