У меня нет понимания в этой основной концепции ООП. Вот пример:
Скажем, у меня есть базовый репозиторий, производный от 3 разных классов. Базовому классу требуется dbContext в конструкторе, внедренный путем внедрения зависимости. Из-за этого дочерние классы должны передавать dbContext каждый раз, когда я их создаю. Требование простое: базовый класс должен создавать экземпляр Context для дочерних классов. Это возможно? Я не хочу, чтобы дочерние классы беспокоились о контексте. Я просто хочу, чтобы они назвали его.
Вот мой базовый класс.
public class CastingBaseRepository<TEntity> : ICastingBaseRepository<TEntity> where TEntity : class, IEntity
{
private readonly CastingContext _context;
public CastingBaseRepository(CastingContext context) => _context = context ?? throw new ArgumentNullException(nameof(context));
// Context property
public CastingContext Context => _context;
}
Вот как будет выглядеть дочерний класс:
public class CommercialJobsRepository : CastingBaseRepository<Audition>, ICommercialJobsRepository
{
/* I do not want to use base(context) here. I need a way for this class to just call Context property from the derived class.. Possible? */
private CastingContext _context;
public CommercialJobsRepository(CastingContext context) : base(context)
{
_context = context;
}
public async Task<IList<OpenJobs>> GetOpenJobs()
{
// test code
var tt = await _context.Audition.Take(10).ToListAsync();
return new List<OpenJobs>();
}
}
Вот мой контекстclass
public partial class CastingContext : DbContext
{
public virtual DbSet<Audition> Audition { get; set; }
public CastingContext(DbContextOptions<CastingContext> options) : base(options)
{
}
}
А вот и файл startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// DB Context
services.AddDbContextPool<CastingContext>(options => { options.EnableSensitiveDataLogging(); options.UseSqlServer(Configuration.GetConnectionString("dbCast")); });
}
}
Я использую шаблон стратегии, чтобы определить, какой дочерний класс будет доступен во время выполнения. Для этого также необходимо, чтобы CastingContext внедрил конструктор, что опять-таки безобразно. Дело в том, что должен быть только один класс, предоставляющий контекст всем производным классам или, возможно, с помощью статического метода. Не могли бы вы помочь мне понять, как это сделать?
Вот мой класс стратегии:
public class JobsStrategyContext
{
private readonly CastingContext _context;
private readonly Dictionary<eBreakdownTypes, IJobsRepository> Strategies =
new Dictionary<eBreakdownTypes, IJobsRepository>();
public JobsStrategyContext(CastingContext context)
{
_context = context;
Strategies.Add(eBreakdownTypes.Ftv, new FtvJobsRepository(_context));
Strategies.Add(eBreakdownTypes.Commercial, new CommercialJobsRepository(_context));
Strategies.Add(eBreakdownTypes.Theatre, new TheatreJobsRepository(_context));
}
public async Task<IList<OpenJobs>> GetOpenJobsBySubType(eBreakdownTypes breakdownType)
{
return await Strategies[breakdownType].GetOpenJobs();
}
}