2014-12-17 24 views
12

Bir WebAPI projesinde SimpleInjector'ı OWIN ile kullanmaya çalışıyorum. Ancak ConfigureAuth aşağıdaki satırı istisna ApplicationUserManager 'Web API Request' yaşam tarzı olarak tescil edilmiştir olduğunuWebApi + Basit Enjektör + OWIN

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

başarısız, ama örnek bir Web API isteği bağlamı dışında talep edilmektedir.

Kapsayıcı başlatılırken container.RegisterWebApiRequest<ApplicationUserManager>(); kullanıyorum. Anlıyorum gibi

, Owin düzgün çalışması için CreatePerOwinContext kullanılarak kayıtlı olması ApplicationUserManager ihtiyaçlar (orada yerine RegisterWebApiRequest ait Register kullanırsanız herhangi bir istisna olmayacaktır ama bu simple injector docs göre tercih edilen yöntem değildir olacaktır). Basit Enjektörün, başlatma sırasında örnekleri çözememesi nedeniyle, Basit Enjektör'ü kullanarak bunu nasıl yapacağız?

Yöntemi zaten this SO answer'da denedim, ancak aynı iletiyle başarısız oluyor.

Bunu nasıl düzeltebilirim?

cevap

12

Bu sorunu çözmek için aşağıdaki kodu kullandım. Sonra

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(); 
    } 
}); 
} 

ve

sağ dependancies kaydettikten sonra app.UseOwinContextInjector(container); aradı.

this post

+4

Örneğinizin bakabileceği bir yere sahip misiniz, çok benzer bir şey yapmaya çalışıyorum, ama aynı zamanda bir işleyici olan sürüm için bir öznitelik olan IdentityServer3 kullanıyorum. – OutOFTouch

+0

Owin + MVC + SimpleInjector'da tam bir örnek verebilir misiniz? – Jerome2606

2

this question yararlı bulabilirsiniz. Buradaki fikir, bağımlılıkları çözmek için OWIN kullanmaktan kaçınmaktır çünkü kontrol cihazınızın koduna biraz dağınıklık getirir. Bunun yerine, bağımlılıkları çözmek için kontrolörün yapıcı içine gerekli servisleri enjekte ve sizin için denetleyici inşa etmek IDependencyResolver kullanmak Owin güvenmek

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

: UserManager örneğini çözmek için Owin kullanan aşağıdaki kod, bir Service Locator anti-pattern olduğunu. This article, ASP.NET Web API'sinde bağımlılık enjeksiyonunun nasıl kullanılacağını gösterir.

+1

Teşekkürler. Bağımlılıkları çözmek için OWIN kullanmıyorum. OWIN dahili olarak ApplicationUserManager kullanır ve bunu OwinContext'ten almaya çalışır. Bu nedenle OWIN'in ApplicationUserManager örneğinin farkında olması, OWIN'nin çalışması için zorunludur (lütfen yanılıyorsam düzeltin). AccountController'da alıntı yaptığınız kodu kullanmıyorum. AccountController, kurucu enjeksiyonu ile ApplicationUserManager alıyor. Yani sorun devam ediyor. – su8898

+1

@ su8898 o zaman [bu blog yazısı] 'na bir göz atmanızı tavsiye edebilirim (http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/) - belki siz Orada bazı yararlı kod örnekleri bulabilirsiniz. –

+0

blog postundaki örnekler, appCreatePerOwinContext (() => DependencyResolver.Current.GetService ()); '_ConfigureAuth_ öğesinde bir MVC projesi olduğu için kullanılır. WebAPI, DependancyResolver için farklı bir uygulamaya sahiptir. Böyle bir yöntem kullansak bile, SimpleInjector'ın _ConfigureAuth_ içinde ApplicationUserManager öğesini çözemeyeceği için başarısız olacağını düşünüyorum. Bu konuda nasıl dolaşacağımı merak ediyorum! – su8898