2017-05-15 14 views
-2

ASP.NET Core(MVC6)アプリケーションのDbContext(EF6)のジェネリッククラス(Factory)を宣言しようとしています。問題は、Dependency Injectionのインターフェイスタイプが必要なことです。C#ジェネリッククラスの定義と一致する汎用インターフェイス

私は複数のアプローチを試してきましたが、google(独特ではない)は役に立たないようです。これは、私の検索が間違った言葉を使用しているか、私がやっていることが全く間違っていることを意味します。

そこで質問です:

私はプロジェクトに2 DbContextsを持っている、と私は(のCreateContext(と呼ばれる))、単一のメソッドを使用して、これらのいずれかにコンテキストを作成することができ、一般的な工場を作成したい場合は、ジェネリックインターフェイスを使用して、依存関係注入を使用することができます。正しいクラス定義はどうですか?

例インタフェース:

public interface IDbContext<C> where C: DbContext 
{ 
    C CreateContext(); //<-- generic bit required here for this method 
} 

例ファクトリー:

public class DbContextFactory<C> : IDbContext<C>, where C: DbContext //<--unable to get this correct 
{ 
    private C _context = null; 
    private string _connectionstring; 

    public DbContextFactory(string connectionString) 
    { 
     _connectionString = connectionString; 
    }  

    public C CreateContext() 
    { 
     try 
     { 
      var optionsBuilder = new DbContextOptionsBuilder<C>(); 
      optionsBuilder.UseSqlServer(_connectionString); 
      //_context = new C(optionsBuilder.Options); //<-- issue here also 
      _context = default(C); //<-- how to pass options?? 
     } 
     catch (Exception ex) 
     { 
     // log some error here 
     } 
     return _context; 
    } 
} 

このテーマに関するすべてのヘルプは非常に高く評価されるだろう。 :)

+3

クラス宣言内のコンマ削除: 'パブリッククラスをDbContextFactory :DbContext' – DavidG

+0

それが見えるかもしれないほど愚かで、実際に(追加の小さな変化を有する)の回答をしたこと、そう答えてくれてありがとう:CはIDbContext 。ポイントに喜んでいただけると思いますが、これに「答えてください」と賞を授与してもらえますか? – MysticSmeg

+0

これは本当に "タイプミス"なのです。だから私はすでにそれを閉じるように投票しました。 – DavidG

答えて

0

として正しく述べ、正しい定義は次のとおりです。期待通り、この作品

インタフェースは同じまま...

public class DbContextFactory<C> : IDbContext<C> where C: DbContext 
{ 
    ... 
} 

public C CreateContext() ... 

関連する問題