簡體   English   中英

OWIN WebAPI簡單注入器EFCoreInMemoryDB注入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM