Entity Framework Code First を使用しています。System.Data.Common.DbConnection
から派生したコンテキストをインスタンス化するときに、オブジェクトを注入できるようにしたいと考えていますSystem.Data.Entity.DbContext
。これは、コードが実行されている環境に応じて、さまざまな種類の接続を渡すことができるようにするためです。つまりSystem.Data.SqlClient
、開発では (SQL Server) を使用し、System.Data.SQLite
単体テストでは (SQL Server を) 使用し、本番環境では何か他のものを使用します。の関連部分はContext
次のようになります。
public class Context : DbContext
{
public Context(DbConnection dbConnection)
: base(dbConnection, true)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());
base.OnModelCreating(modelBuilder);
}
public DbSet<Test> Tests { get; set; }
}
それは私に次のエラーを与えます:私が達成しようとしているIoCパターンとは無関係に、The target context 'Services.Persistence.Context' is not constructible. Add a default constructor or provide an implementation of IDbContextFactory.
モデルの初期化中にEntity Frameworkが明らかにそれ自身のものを新しくする必要があると感じたときにこれが起こると思います。Context
既定のコンストラクターがないのは、設計によるものです。IDbContextFactory
インターフェースも同様に役に立たない - デフォルトのコンストラクターも必要です。
Entity Framework Code First は、構成ファイルから接続文字列を読み取る (または、接続文字列を直接渡す) ことによってその構成を設定するという考えに完全に固執していますか、それともこれを回避できますか?
UPDATE、ここにウィンザーの設定があります:
container.Register(Component
.For<DbConnection>()
.UsingFactoryMethod(() =>
new SqlConnection("Data Source=(localdb)\\v11.0;Database=ThatProject;MultipleActiveResultSets=true"))
.LifeStyle.Transient);
container.Register(Component
.For<Context>()
.UsingFactoryMethod(k => new Context(k.Resolve<DbConnection>()))
.LifeStyle.PerWebRequest);
container.Register(Component
.For<IRepository>()
.UsingFactoryMethod(k => new Repository(k.Resolve<Context>()))
.LifeStyle.PerWebRequest);