スコープ:このDbContext
はFunc<T>
工場、using the guidelines in the Simple Injector documentation使用して配線されているDbContextと私はシンプルな<code>DbContext</code>は次のように見ている依存
public class MyDbContext : DbContext
{
private readonly IUserContext _userContext;
public MyDbContext(IUserContext userContext) : base("DefaultConnectionString")
{
_userContext = userContext;
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ... Here I need to creates some filters using the IUserContext dependency
base.OnModelCreating(modelBuilder);
}
}
:container.RegisterFuncFactory<DbContext, MyDbContext>(Lifestyle.Scoped);
public static void RegisterFuncFactory<TService, TImpl>(
this Container container, Lifestyle lifestyle = null)
where TService : class
where TImpl : class, TService
{
lifestyle = lifestyle ?? Lifestyle.Transient;
var producer = lifestyle.CreateProducer<TService, TImpl>(container);
container.RegisterSingleton<Func<TService>>(producer.GetInstance);
}
をしかしapperently、このような単純なケースはでは不可能ですこのメッセージのためDbContext
があります。
ターゲットコンテキスト 'MyDbContext'は構成可能ではありません。デフォルトの コンストラクタを追加するか、IDbContextFactoryの実装を提供してください。
私が思い付くことができる唯一の解決策は、MyDbContext
の依存を削除するには、プロパティとして設定し、RegisterFuncFactory
方法を変更し、手動でコンテキストを初期化することですので、私は、IDbContextFactory
のアイデアのように本当にいけません:
internal static void RegisterFuncFactory<TService, TImpl>(this Container container, Func<TImpl> instanceProducer, Lifestyle lifestyle = null) where TService : class where TImpl : class, TService
{
lifestyle = lifestyle ?? Lifestyle.Transient;
var producer = lifestyle.CreateProducer<TService>(instanceProducer, container);
container.Register<Func<TService>>(() => producer.GetInstance, Lifestyle.Singleton);
}
container.RegisterFuncFactory<DbContext, MyDbContext>(() => new MyDbContext
{
UserContext = container.GetInstance<IUserContext>()
}, Lifestyle.Scoped);
エレガントではありませんが、私が必要としている別の「より良い」方法はありますか?私は文脈に依存していることは明白ですが、不可能と思われます。
はUPDATE
エラーから来ている:
'System.Data.Entity.Migrations.Infrastructure.MigrationsException' はEntityFramework.dllで発生したが、ユーザーコード
で処理されませんでした
このコードでは、クエリメソッドのreturn文は次のとおりです。
internal sealed class EntityFrameworkRepository<TEntity> : IEntityWriter<TEntity>, IEntityReader<TEntity> where TEntity : Entity
{
private readonly Func<DbContext> _contextProvider;
public EntityFrameworkRepository(Func<DbContext> contextProvider)
{
_contextProvider = contextProvider;
}
public IQueryable<TEntity> Query()
{
var context = _contextProvider();
return context.Set<TEntity>().AsNoTracking();
}
// Methods removed for brevity
}
:
この
はその後のような構図のルートで配線されていますか? EFの移行? – Stevenはい、エラーは、System.Data.Entity.Migrations.Infrastructure.MigrationsExceptionがEntityFrameworkで発生しています。dllが、ユーザコードでは扱われませんでした」と返されました。ここでは 'var context = _contextProvider(); return context.Set().AsNoTracking(); ' –
janhartmann
@janhartmann'エンティティ '(制約)とは何ですか?今は 'TEntity'が許可されていないインターフェースになる可能性があるので、' class'制約も指定するべきだと思います。 –