0

을 사용하면 작은 MVC 코어 응용 프로그램 (예 : Entity Framework Core 및 MongoDB가있는 경우)없이 두 데이터베이스 엔진 사이를 전환 할 위치가 있다고 할 수 있습니다. 내 appsettings.json에서MVC 핵심 프로젝트에서 데이터베이스 컨텍스트를 삽입하면

, 나는 다음과 같은 노드가 : 내 Startup.cs에서 다음

{ 
    "UseMongo": false, 
    "MongoDB": { 
    "ConnectionString": "mongodb://127.0.0.1", 
    "DatabaseName": "CoreDB", 
    "IsSSL": true 
    }, 
    "EntityDB": { 
    "ConnectionString": "mongodb://127.0.0.1", 
    "DatabaseName": "CoreDB" 
    } 
} 

을 나는 다음과 같은 코드를 가지고 : 다음 인터페이스를 선언

if (Configuration.GetValue<bool>("UseMongo")) 
{ 
    MongoDbContext.ConnectionString = Configuration.GetSection("MongoDB:ConnectionString").Value; 
    MongoDbContext.DatabaseName = Configuration.GetSection("MongoDB:DatabaseName").Value; 
    //Somehow inject context into application so it is available globally    
} 
else 
{ 
    EfDbContext.ConnectionString = Configuration.GetSection("EntityDB:ConnectionString").Value; 
    EfDbContext.DatabaseName = Configuration.GetSection("EntityDB:DatabaseName").Value; 
    //Somehow inject context into application so it is available globally 
} 

을하는에서 두 개의 저장소 클래스가 파생됩니다.

public interface IRepository : IDisposable 
{ 
    void GetData(); 
} 

public class EfRepository : IRepository 
{ 
    public void GetData() 
    { 
     //DB logic 
    } 
} 

public class MongoRepository : IRepository 
{ 
    public void GetData() 
    { 
     //DB logic 
    } 
} 

지금까지 그렇게 좋았습니다. 이제는 appsettings.json의 "UseMongo"스위치에 따라 저장소 클래스를 사용하고 싶습니다. 나는 의존성 주입을 조금 보았지만 해결책을 찾지 못했습니다. 내 컨트롤러에서이 작업을 수행 할 수 있기를 원합니다.

public class ValuesController : Controller 
{ 
    private IRepository _repository; 

    public ValuesController(IRepository repository) 
    { 
     _repository= repository; 
    } 
} 

이 작업을 수행 할 수 있습니까?

답변

1

if (Configuration.GetValue<bool>("UseMongo")) 
{ 
services.AddScoped(typeof(IRepository),typeof(MongoRepository)) 
} 
else 
{ 
services.AddScoped(typeof(IRepository),typeof(EfRepository)) 
} 
+0

그냥 하나 개의 질문과 같이 할 수있다 :이 좋은 방법인가? DbContext가 삽입 된 위치에서 읽은 모든 예제는 컨텍스트를 주입하기 위해 services.AddDbContext를 사용합니다. – LeonidasFett

+0

DbContext의 인스턴스를 어떻게 작성하고 있습니까? 리포지토리에 생성하거나 DI를 사용하여 주입합니까? DI를 사용하는 경우 AddDbContext 메소드를 추가 할 수 있습니다. – Anuraj

+0

아직 그 부분을 구현하지는 않았지만 저장소 클래스에서 인스턴스화 할 계획이므로 올바르게 이해하면 AddDbContext를 사용하지 않아도 괜찮을 것으로 생각됩니다. – LeonidasFett

관련 문제