簡體   English   中英

具有標識的StructureMap DbContext

[英]StructureMap DbContext with identity

所以我最近開始使用結構圖。 我有一個使用身份的Web API。 我的目標是每個請求都有一個dbcontext。 當前,我遇到了上下文問題,通過結構映射注入的上下文與用戶管理器所使用的上下文不同。 我環顧四周,找不到解決方案,即使我肯定它很明顯。

所以首先我要設置我的結構圖。

public class DefaultRegistry : Registry {
    #region Constructors and Destructors

    public DefaultRegistry() {
        Scan(
            scan => {
                scan.TheCallingAssembly();
                scan.AddAllTypesOf<IImporterService>().NameBy(type => type.Name);
                scan.WithDefaultConventions();
            });

        For<IHttpContextBaseWrapper>().Use<HttpContextBaseWrapper>();
        For<ApplicationDbContext>().Use(() => new ApplicationDbContext());
        For<HttpContextBase>().Use(() => new HttpContextWrapper(HttpContext.Current));
    }

    #endregion
}

我暫時不需要在基礎服務中通過httpcontext訪問用戶管理器,我知道將來可能需要對單元管理進行更改。

接下來,我們有啟動身份驗證。

private void ConfigureOAuthTokenGeneration(IAppBuilder app)
    {
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

        //Token Auth
        var OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/api/account/login"),
            Provider = new ApplicationOAuthProvider("self"),
            AuthorizeEndpointPath = new PathString("/api/AccountApi/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(121),
            RefreshTokenProvider = new ApplicationRefreshTokenProvider(),
            //#if DEBUG
            AllowInsecureHttp = true,
            //#endif
        };

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);
    }

我減少了代碼,但具有服務層和存儲庫層的典型結構。 所有使用structuremap注入的服務和存儲庫都具有正確的上下文,唯一的不是用戶管理器。 我知道以下導致問題的行:

app.CreatePerOwinContext(ApplicationDbContext.Create);

但是,就像我說的那樣,我仍然習慣於結構化地圖,我以前使用的是unity,只會從當前容器中解析出我需要的實例。 任何幫助或指導,不勝感激。

所有這些行的問題:

    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

首先,您告訴一個中間件來管理DbContext創建。 然后告訴中間件管理ApplicationUserManagerApplicationUserManager.Create創建ApplicationUserManager.Create接受一個由該中間件而不是由DI容器管理的ApplicationDbContext實例。 您的ApplicationRoleManager也會發生同樣的情況。 最后,您有兩種方法可以針對每個請求生成ApplicationDbContext一種通過您的DI容器,另一種通過中間件。

如果只希望有一個ApplicationDbContext實例,則需要擺脫創建實例的第二種方法: ApplicationDbContext.Create 這樣可以解決您的問題。

但是,您的中間件仍然需要訪問ApplicationUserManager 因此,而不是所有這些:

   app.CreatePerOwinContext(ApplicationDbContext.Create);
   app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
   app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

您需要使用app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

除從DI容器中注入外,還擺脫所有其他創建這些實例的方法。

我的舊博客文章中的更多信息-滾動至“清理”部分,以獲取有關中間件注冊的詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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