У меня есть проект .net core 2.1. И мои классы репозитория, как показано ниже. Но из-за того, что конструктор MyDbContext
имеет параметр, я получаю сообщение об ошибке, как показано ниже. Когда я удаляю параметр JwtHelper, он работает отлично. Но мне нужно добавить JwtHelper
в MyDbContext.cs
для ведения журналов аудита. Как этого добиться?
«MyDbContext» должен быть неабстрактным типом с общедоступным конструктором без параметров, чтобы использовать его в качестве параметра «TContext» в универсальном типе или методе «UnitOfWork».
UnitOfWork.cs
public class UnitOfWork<TContext> : IUnitOfWork<TContext> where TContext : DbContext, new()
{
protected readonly DbContext DataContext;
public UnitOfWork()
{
DataContext = new TContext();
}
public virtual async Task<int> CompleteAsync()
{
return await DataContext.SaveChangesAsync();
}
public void Dispose()
{
DataContext?.Dispose();
}
}
IUnitOfWork.cs
public interface IUnitOfWork<U> where U : DbContext
{
Task<int> CompleteAsync();
}
MyRepos.cs
public class MyRepos : UnitOfWork<MyDbContext>, IMyRepos
{
private IUserRepository userRepo;
public IUserRepository UserRepo { get { return userRepo ?? (userRepo = new UserRepository(DataContext)); } }
}
IMyRepos.cs
public interface IMyRepos : IUnitOfWork<MyDbContext>
{
IUserRepository UserRepo { get; }
}
MyDbContext.cs
public class MyDbContext : DbContext
{
private readonly IJwtHelper jwtHelper;
public MyDbContext(IJwtHelper jwtHelper) : base()
{
this.jwtHelper= jwtHelper;
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var userId=jwtHelper.GetUserId();
SaveAudits(userId,base.ChangeTracker);
return (await base.SaveChangesAsync(true, cancellationToken));
}
}
UserRepository.cs
public class UserRepository : Repository<User>, IUserRepository
{
private readonly MyDbContext_context;
public UserRepository(DbContext context) : base(context)
{
_context = _context ?? (MyDbContext)context;
}
}
IUserRepository.cs
public interface IUserRepository : IRepository<User>
{ }
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IJwtHelper, JwtHelper>();
services.AddScoped<DbContext, MyDbContext>();
services.AddTransient<IMyRepos, MyRepos>();
}
new()
для параметраTContext
в классеUnitOfWork<TContext>
? Если это так, вам понадобится конструкция без параметров. У вас может быть более одного конструктора, кстати. - person CoolBots   schedule 18.02.2019UnitOfWork
хочет запуститьDataContext = new TContext();
. Откуда он должен получитьIJwtHelper
(если это можно параметризовать)? - person Damien_The_Unbeliever   schedule 18.02.2019DataContext = new TContext();
? Если это возможно, я удаляю ограничениеnew()
. - person realist   schedule 18.02.2019new()
и конструктор без параметров вTContext
. Возможно,IJwtHelper
можно передать каким-то другим способом, например, как свойство? Затем его можно передать в конструкторUnitOfWork
и установить как свойствоTContext
. - person CoolBots   schedule 18.02.2019public UnitOfWork(IAuditHelper auditHelper) { this.auditHelper = auditHelper; DataContext = new TContext(auditHelper); }
. Но я получаю ошибку'TContext': cannot provide arguments when creating an instance of a variable type
. ` - person realist   schedule 18.02.2019UnitOfWork
, просто передайте ему уже созданныйTContext
и устраните ограничениеnew()
, и это сработает. - person Damien_The_Unbeliever   schedule 18.02.2019UnitOfWork
создавал экземпляр, передавая хелпер, вам нужно дать емуFunc<IJwtHelper, TContext>
хелпер, который может содержать определенныйnew
код, который вы не можете иметь внутри универсального. - person Damien_The_Unbeliever   schedule 18.02.2019Func<IJwtHelper, TContext>
в свои классы? @Damien_The_Unbeliever - person realist   schedule 18.02.2019