[英]OWIN WebAPI Simple Injector EFCoreInMemoryDB injection
我正在使用OWIN構建服務,我想使用UserDbContext(DBOptions)將EF內核注入內存db中
Startup.cs:
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
// How to Register In memory DB?!
// I get an exception on DbContextOptions< in UserContext
container.Register<DbContext>(() => {
var optionsBuilder = new DbContextOptionsBuilder<UserContext>()
.UseInMemoryDatabase("UserContext");
return new UserContext(optionsBuilder.Options);
});
container.Register<IUserRepository, UserRepository>();
config.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
我已經走了很多,以至於在啟動服務時沒有異常。 但是當我調用API時,出現了一個異常:
UserContext類型的構造函數包含名稱為“ options”的參數,並且類型DbContextOptions <UserContext>未注冊。 請確保DbContextOptions <TUserContext>已注冊,或更改UserContext的構造函數
UserRepository.cs
public class UserRepository : IUserRepository
{
private readonly UserContext context;
public UserRepository(UserContext context)
{
this.context = context;
}
}
UserContext.cs
public class UserContext : DbContext
{
public UserContext(DbContextOptions<UserContext> options)
: base()
{
}
public DbSet<User> Users { get; set; }
}
那么,如何使用Simple Injector通過UserContext
在ef核心內存db中注冊? 使用標准的.NET Core DI做到這一點將非常容易。
發生錯誤是因為您沒有注冊UserContext
,而只有DbContext
。 將您的container.Register<DbContext>(...)
注冊更改為以下內容:
container.Register<UserContext>(() => ...);
還要注意,您當前使用的是Transient
生活方式注冊UserContext
,而DbContext
的最典型生活方式是Scoped
:
container.Register<UserContext>(() => ..., Lifestyle.Scoped);
使用標准的.NET Core DI做到這一點將非常容易。
使用簡單進樣器也非常容易:)使用Core DI,您基本上需要相同的注冊。
讓您感到困惑的是,默認情況下,Simple Injector v4會嘗試為您實例化未注冊的具體依賴關系。 UserContext
未注冊。 Simple Injector嘗試創建它,但是發現它無法解析其依賴項之一。 這就是錯誤消息指向DbContextOptions<UserContext>
,而錯誤是“您沒有注冊UserContext”。
要解決此問題,此“未注冊的具體類型的解析”行為將從v5開始更改。 默認情況下,v5將不再解析未注冊的具體類型。 這樣比較安全,並且會導致出現更明顯的異常消息。
隨着Simple Injector v4.5的引入,我們引入了一個選項,使您可以切換到即將到來的v5行為。 我的建議是立即使用此新設置,因為這是更安全的行為,可以防止您在切換到v5后遇到錯誤。 您可以按照以下步驟進行操作:
var container = new Container();
container.Options.ResolveUnregisteredConcreteTypes = false;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.