0

は、私が2つのデータベースエンジンを切り替える(例えば、私がEntity Framework CoreとMongoDBを持っている場合のように)小さなMVCコアアプリケーションを持っていると言います。私appsettings.jsonでMVCコアプロジェクトでデータベースコンテキストを注入する

、私は次のノードを有する:

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

をその後、私Startup.csに、私は、次のコードを有する:

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 
} 

をIは、次いで、そこからインターフェースを宣言する2つのリポジトリクラスは次のようになります。

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

関連する問題