2014-12-17 31 views
12

Sto cercando di utilizzare SimpleInjector con OWIN in un progetto WebAPI. Tuttavia, la seguente riga nel ConfigureAuth non riesceWebApi + Iniettore semplice + OWIN

app.CreatePerOwinContext(container.GetInstance<ApplicationUserManager>); 

L'eccezione è L'ApplicationUserManager è registrata come 'richiesta API Web' stile di vita, ma l'istanza è richiesto al di fuori del contesto di un Web API richiesta.

Sto utilizzando container.RegisterWebApiRequest<ApplicationUserManager>(); nell'inizializzazione del contenitore. (Non ci sarà alcuna eccezione se uso Register invece di RegisterWebApiRequest ma questo non è il metodo preferito secondo simple injector docs)

quanto ho capito, ApplicationUserManager deve essere registrato utilizzando CreatePerOwinContext per OWIN per funzionare correttamente. Mi chiedo come possiamo farlo usando Simple Injector dato che Simple Injector non può risolvere istanze durante l'avvio.

Ho già provato il metodo in this SO answer ma non riesce con lo stesso messaggio.

Qualche idea come posso risolvere questo?

risposta

12

Ho utilizzato il seguente codice per risolvere questo problema.

public static void UseOwinContextInjector(this IAppBuilder app, Container container) 
{ 
// Create an OWIN middleware to create an execution context scope 
app.Use(async (context, next) => 
{ 
    using (var scope = container.BeginExecutionContextScope()) 
    { 
     await next.Invoke(); 
    } 
}); 
} 

e poi chiamato app.UseOwinContextInjector(container); destra dopo aver registrato le dipendenze.

Grazie a this post

+4

Avete l'intero esempio da cercare, sto provando a fare qualcosa di molto simile, ma sto anche usando IdentityServer3, un gestore un attributo per il controllo delle versioni. – OutOFTouch

+0

Potete fornire un esempio completo su Owin + MVC + SimpleInjector? – Jerome2606

2

È possibile trovare utile this question. L'idea è di evitare l'uso di OWIN per risolvere le dipendenze perché introduce una certa confusione nel codice del controller. Il seguente codice che utilizza OWIN per risolvere UserManager istanza è un Service Locator anti-pattern:

public ApplicationUserManager UserManager 
{ 
    get 
    { 
     return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();     
    } 
    set 
    { 
     _userManager = value; 
    } 
} 

Invece di basarsi su OWIN per risolvere le dipendenze, iniettare servizi richiesti nel costruttore del controller e utilizzare IDependencyResolver per costruire controller per voi. This article illustra come utilizzare l'integrazione delle dipendenze nell'API Web ASP.NET.

+1

Grazie. Non sto usando OWIN per risolvere le dipendenze. OWIN utilizza internamente ApplicationUserManager e tenta di ottenere questo da OwinContext. Quindi rendere OWIN consapevole dell'istanza ApplicationUserManager è obbligatorio per il funzionamento di OWIN (correggimi se ho torto). Non sto usando il codice che hai citato in AccountController. AccountController sta ricevendo ApplicationUserManager tramite l'iniezione del costruttore. Quindi il problema rimane. – su8898

+1

@ su8898 quindi potrei consigliarti di dare un'occhiata a [questo post del blog] (http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/) - forse tu? Troverete alcuni esempi di codice utili lì. –

+0

gli esempi nel post del blog utilizzano 'app.CreatePerOwinContext (() => DependencyResolver.Current.GetService ());' in _ConfigureAuth_ perché è un progetto MVC. WebAPI ha un'implementazione diversa per DependancyResolver. Anche se usiamo un metodo come questo, penso che fallirebbe perché SimpleInjector non sarebbe in grado di risolvere 'ApplicationUserManager' in _ConfigureAuth_. Mi chiedo come faccio ad aggirare questo problema! – su8898

Problemi correlati