이 기본 OOP 개념에 대한 이해가 부족합니다. 다음은 그 예입니다.
3 개의 다른 클래스에서 파생 된 기본 저장소가 있다고 가정 해 보겠습니다. 기본 클래스에는 종속성 주입에 의해 주입 된 생성자에 dbContext가 필요합니다. 이 때문에 자식 클래스는 인스턴스화 할 때마다 dbContext를 전달해야합니다. 요구 사항은 간단합니다. 기본 클래스는 자식 클래스에 대한 컨텍스트를 인스턴스화해야합니다. 가능합니까? 나는 자식 클래스가 컨텍스트에 대해 걱정하지 않기를 바랍니다. 나는 그들이 그것을 부르기를 바랍니다.
다음은 기본 클래스입니다.
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>();
}
}
내 컨텍스트 클래스는 다음과 같습니다.
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();
}
}
아니, 당신은 둘 다 동시에 사용 의존성 주입의 수 와 기본 클래스에 의존성의 인스턴스를 하드. 외부 소비자로부터 종속성을 주입하려면 파생 생성자를 통과해야합니다.
기껏 해야 기본 생성자가 dbcontext를 가져 오는 데 사용하는 서비스 로케이터를 전달할 수 있지만 여전히 파생 클래스에서 서비스 로케이터를 처리하고 있습니다. 그러나 서비스 로케이터는 가독성 / 유용성을 감소시키고 충분히 큰 코드베이스에서 처리하기위한 일반적인 골칫거리가되는 것과 같은 눈에 띄는 단점이 있기 때문에 더 이상 좋은 방법으로 간주되지 않습니다 .
기술적으로 원하는 것을 달성하지만 정적 서비스 로케이터를 사용하지 마십시오. 비용 은 이점보다 훨씬 큽니다.
그러나 문제의 시작은 제게 이해가되지 않습니다. 종속성 주입을 사용하는 경우 모든 종속성을 수동으로 인스턴스화 할 필요가없는 일종의 자동 주입을 사용하고 있다고 가정합니다.
예, 여전히 dbcontext를 (파생 및 기본) 생성자 매개 변수로 언급해야하지만 파생 클래스가이를 처리 할 필요가 없습니다 (기본 생성자에 전달하는 것 외에는 예외입니다. 의존성 주입 측면에서 최대한의 자유를 제공합니다.
이것이 상속이 의도적으로 작동하는 방식입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다