2017-08-09 44 views
1

我已經在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; 
} 
+0

當「新建」MyDataContext「時,你使用了一個替代的(即非參數較少的)構造函數嗎? – Stefan

+0

我只是忽略注入的對象,並在構造函數中設置字段像'_dbcontext = new MyDataContext()',所以簽名不會改變。 –

回答

1

我已經通過更改註冊來解決這個問題。

container.Register<IDbContext>(i => new MyDataContext()).ReusedWithin(ReuseScope.Request);

我的原登記container.AddScoped<IDbContext, MyDataContext>();是用於自動裝配Autowired註冊類型速記; container.RegisterAutoWiredAs<MyDataContext,IDbContext>().ReusedWithin(ReuseScope.Request);

我不知道在使用AutoWired時Func容器是否試圖解析iDbSet屬性。這可以解釋爲什麼他們最終爲空。