Dbcontext在注入ServiceStack时IDbset属性为空IoC
问题描述:
我已经在ServiceStack中使用标准容器注册了我的DbContext,将DbContext注入到服务中,但奇怪的是IDbSet
属性为null
,所有其他属性均如预期。Dbcontext在注入ServiceStack时IDbset属性为空IoC
如果我在服务构造函数中新建了DbContext,那么IDbSet
属性就像您期望的那样实例化,只是为了证明EF的配置已正确设置。所有其他注册的服务都是正确注入的,没有这种奇怪的行为。
我错过了什么?
public class AppHost : AppHostBase
{
public override void Configure(Container container)
{
container.AddScoped<IDbContext, MyDataContext>();
// Other registrations here omitted for brevity.
}
}
public interface IDbContext : IDisposable
{
IDbSet<MyEntity> MyEntity { get; set; }
DbChangeTracker ChangeTracker { get; }
DbContextConfiguration Configuration { get; }
Database Database { get; }
int SaveChanges();
Task<int> SaveChangesAsync();
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
DbEntityEntry<T> Entry<T>(T entity) where T : class;
}
答
我已经通过更改注册来解决这个问题。
container.Register<IDbContext>(i => new MyDataContext()).ReusedWithin(ReuseScope.Request);
我的原登记container.AddScoped<IDbContext, MyDataContext>();
是用于自动装配Autowired注册类型速记; container.RegisterAutoWiredAs<MyDataContext,IDbContext>().ReusedWithin(ReuseScope.Request);
我不知道在使用AutoWired时Func容器是否试图解析iDbSet属性。这可以解释为什么他们最终为空。
当“新建”MyDataContext“时,你使用了一个替代的(即非参数较少的)构造函数吗? – Stefan
我只是忽略注入的对象,并在构造函数中设置字段像'_dbcontext = new MyDataContext()',所以签名不会改变。 –