상속-기본 클래스 생성자를 인스턴스화하는 데 필요한 파생 클래스

Shezi

이 기본 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

상속 된 인수를 기본 클래스 생성자에 전달한 다음 파생 클래스 생성자에서 작업 수행

분류에서Dev

abstact 기본 클래스에서 상속 된 클래스 인스턴스의 새 클래스 인스턴스 생성 / 리셋 클래스 인스턴스

분류에서Dev

기본 클래스 생성자에서 파생 클래스 속성 사용

분류에서Dev

C ++ 상속 : 기본 클래스에 대한 파생 클래스 포인터가 파생 클래스 메서드를 호출합니다.

분류에서Dev

생성자 및 가상 기본 클래스 상속

분류에서Dev

기본 클래스 함수 데코레이터에서 파생 된 클래스 속성에 액세스

분류에서Dev

Python 상속 : 기본 클래스에서 파생 클래스로 변환

분류에서Dev

상속의 기본 클래스가 파생 클래스에 복사됩니까?

분류에서Dev

OOP 상속 : 파생 클래스에서 기본 클래스의 배열 수정

분류에서Dev

파생 클래스를 인스턴스화하는 기본 클래스의 팩토리 메서드

분류에서Dev

C ++에서 기본 및 파생 클래스에 대한 '가상'생성자를 선언 하시겠습니까?

분류에서Dev

파생 클래스에서 JavaScript 기본 클래스 인스턴스를 생성하는 방법

분류에서Dev

기본 클래스 생성자에서 인스턴스화 된 파생 클래스 파악

분류에서Dev

생성자가 C ++에서 인스턴스화 할 적절한 하위 클래스를 선택하는 추상 클래스를 작성할 수 있습니까?

분류에서Dev

롬복 @Data는 추상 클래스 최종 필드를 가지고, "롬복는 기본 클래스의 기본 생성자가 필요합니다"불만

분류에서Dev

기본 클래스의 인스턴스를 사용하여 파생 데이터 클래스를 초기화 할 수 있습니까?

분류에서Dev

상속 문제 : 파생 클래스가 기본 클래스를 상속하지 않음

분류에서Dev

기본 생성자가없는 가상베이스에서 클래스 파생

분류에서Dev

파생 클래스 속성을 Angular의 기본 클래스 생성자에 전달할 때 오류 발생

분류에서Dev

C ++ 상속 : 파생 클래스의 인스턴스를 사용하여 기본 클래스의 가상 함수 호출

분류에서Dev

파생 클래스 생성자에서 기본 클래스 생성자 호출

분류에서Dev

C ++ 공개 상속 기본 클래스 호출 파생 클래스의 개인 가상 기능

분류에서Dev

생성자의 기본 클래스 속성에 액세스

분류에서Dev

상속받은 클래스에서 동일한 작업을 수행 할 수 있는데 왜 클래스에서 생성자를 설정하여 기본 매개 변수를 설정합니까?

분류에서Dev

std :: throw_with_nested는 Exception의 가상 기본 클래스에 대한 기본 생성자를 예상합니까?

분류에서Dev

상속 된 클래스 생성자 인수를 기본 생성자 인수로 전달

분류에서Dev

상속 된 기본 생성자의 일부만 사용하는 C ++ 파생 클래스

분류에서Dev

파생 클래스를 인수로 사용하는 C ++ 기본 클래스 생성자 (?)

분류에서Dev

가상 기본 클래스 함수의 파생 클래스 크기

Related 관련 기사

  1. 1

    상속 된 인수를 기본 클래스 생성자에 전달한 다음 파생 클래스 생성자에서 작업 수행

  2. 2

    abstact 기본 클래스에서 상속 된 클래스 인스턴스의 새 클래스 인스턴스 생성 / 리셋 클래스 인스턴스

  3. 3

    기본 클래스 생성자에서 파생 클래스 속성 사용

  4. 4

    C ++ 상속 : 기본 클래스에 대한 파생 클래스 포인터가 파생 클래스 메서드를 호출합니다.

  5. 5

    생성자 및 가상 기본 클래스 상속

  6. 6

    기본 클래스 함수 데코레이터에서 파생 된 클래스 속성에 액세스

  7. 7

    Python 상속 : 기본 클래스에서 파생 클래스로 변환

  8. 8

    상속의 기본 클래스가 파생 클래스에 복사됩니까?

  9. 9

    OOP 상속 : 파생 클래스에서 기본 클래스의 배열 수정

  10. 10

    파생 클래스를 인스턴스화하는 기본 클래스의 팩토리 메서드

  11. 11

    C ++에서 기본 및 파생 클래스에 대한 '가상'생성자를 선언 하시겠습니까?

  12. 12

    파생 클래스에서 JavaScript 기본 클래스 인스턴스를 생성하는 방법

  13. 13

    기본 클래스 생성자에서 인스턴스화 된 파생 클래스 파악

  14. 14

    생성자가 C ++에서 인스턴스화 할 적절한 하위 클래스를 선택하는 추상 클래스를 작성할 수 있습니까?

  15. 15

    롬복 @Data는 추상 클래스 최종 필드를 가지고, "롬복는 기본 클래스의 기본 생성자가 필요합니다"불만

  16. 16

    기본 클래스의 인스턴스를 사용하여 파생 데이터 클래스를 초기화 할 수 있습니까?

  17. 17

    상속 문제 : 파생 클래스가 기본 클래스를 상속하지 않음

  18. 18

    기본 생성자가없는 가상베이스에서 클래스 파생

  19. 19

    파생 클래스 속성을 Angular의 기본 클래스 생성자에 전달할 때 오류 발생

  20. 20

    C ++ 상속 : 파생 클래스의 인스턴스를 사용하여 기본 클래스의 가상 함수 호출

  21. 21

    파생 클래스 생성자에서 기본 클래스 생성자 호출

  22. 22

    C ++ 공개 상속 기본 클래스 호출 파생 클래스의 개인 가상 기능

  23. 23

    생성자의 기본 클래스 속성에 액세스

  24. 24

    상속받은 클래스에서 동일한 작업을 수행 할 수 있는데 왜 클래스에서 생성자를 설정하여 기본 매개 변수를 설정합니까?

  25. 25

    std :: throw_with_nested는 Exception의 가상 기본 클래스에 대한 기본 생성자를 예상합니까?

  26. 26

    상속 된 클래스 생성자 인수를 기본 생성자 인수로 전달

  27. 27

    상속 된 기본 생성자의 일부만 사용하는 C ++ 파생 클래스

  28. 28

    파생 클래스를 인수로 사용하는 C ++ 기본 클래스 생성자 (?)

  29. 29

    가상 기본 클래스 함수의 파생 클래스 크기

뜨겁다태그

보관