Внедрение зависимостей ASP.NET Core не поддерживает внедрение свойств, вместо этого вы можете внедрить зависимости в конструктор, как показано ниже.Другой вариант - использовать контейнеры, которые поддерживают внедрение свойств, например Unity или Autofac .
public class DataContext : DbContext, IDataContext
{
public DataContext(IAuditHelper auditHelper, DbContextOptions options)
: base(options)
{
AuditHelper = auditHelper;
}
public IAuditHelper AuditHelper { get; private set; }
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
AuditHelper.LogMyChangesToDatabase();
return base.SaveChangesAsync(true, cancellationToken);
}
...
}
public interface IDataContext : IDisposable
{
IAuditHelper AuditHelper { get; }
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
...
}
public class UniversityDbContext : DataContext
{
public UniversityDbContext(IAuditHelper auditHelper, DbContextOptions options)
: base(auditHelper, options)
{
}
}
. Я не совсем понимаю, зачем вам нужен AuditHelper в интерфейсе IDataContext, ясохранит его в приватном файле в DataContext и не предоставит его.
Класс AuditHelper:
public class AuditHelper : IAuditHelper
{
private readonly IHttpContextAccessor _httpContextAccessor;
public AuditHelper(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void LogMyChangesToDatabase()
{
//_httpContextAccessor.HttpContext.
}
}
В классе запуска:
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddHttpContextAccessor();
services.AddDbContext<UniversityDbContext>(options
=> options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=TestUniversity;Trusted_Connection=True;MultipleActiveResultSets=true"));
services.AddScoped<IAuditHelper, AuditHelper>();
...
}
...
}
Вы можетенайти разницу между областями в ссылка .
Контроллер:
public class SomeController : ControllerBase
{
private readonly UniversityDbContext _context;
public SomeController(UniversityDbContext context)
{
_context = context;
}
[HttpPost]
public async Task Post([FromBody] string value)
{
...
await _context.SaveChangesAsync();
}
}
Я также рекомендую следовать TAP и изменить LogMyChangesToDatabase:
public async Task LogMyChangesToDatabase()
{
//_httpContextAccessor.HttpContext.
//await
}
SaveChangesAsync будет соответственно:
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
await AuditHelper.LogMyChangesToDatabase();
return await base.SaveChangesAsync(true, cancellationToken);
}
И причина соединения должна быть в конфигурации, см. Учебник .