2014-12-17 15 views
12

Tôi đang cố gắng sử dụng SimpleInjector với OWIN trong dự án WebAPI. Tuy nhiên, các dòng sau trong ConfigureAuth khôngWebApi + Đầu phun đơn giản + OWIN

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

Trường hợp ngoại lệ là Các ApplicationUserManager được đăng ký như 'Web API Yêu Cầu' lối sống, nhưng trường hợp được yêu cầu bên ngoài bối cảnh của một Request Web API.

Tôi đang sử dụng container.RegisterWebApiRequest<ApplicationUserManager>(); trong quá trình khởi tạo vùng chứa. (Sẽ không có bất kỳ ngoại lệ nếu tôi sử dụng Register thay vì RegisterWebApiRequest nhưng đây không phải là phương pháp ưa thích theo simple injector docs)

Theo tôi được biết, ApplicationUserManager cần phải được đăng ký sử dụng CreatePerOwinContext cho OWIN hoạt động tốt. Tôi tự hỏi làm thế nào để chúng tôi làm điều này bằng cách sử dụng Simple Injector cho rằng Simple Injector không thể giải quyết các trường hợp trong quá trình khởi động.

Tôi đã thử phương pháp trong this SO answer nhưng không thành công với cùng một thông báo.

Bất kỳ ý tưởng nào tôi có thể giải quyết vấn đề này?

Trả lời

12

Tôi đã sử dụng mã sau để giải quyết vấn đề này.

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

và sau đó gọi là app.UseOwinContextInjector(container); ngay sau khi đăng ký phụ thuộc.

Nhờ this post

+4

Bạn có ví dụ đầy đủ ở đâu đó để xem không, tôi đang thử làm một cái gì đó rất giống nhau, nhưng tôi cũng sử dụng IdentityServer3, một trình xử lý một thuộc tính cho phiên bản. – OutOFTouch

+0

Bạn có thể cung cấp một ví dụ đầy đủ về Owin + MVC + SimpleInjector không? – Jerome2606

2

Bạn có thể tìm thấy this question hữu ích. Ý tưởng là tránh sử dụng OWIN để giải quyết các phụ thuộc vì nó giới thiệu một số lộn xộn cho mã bộ điều khiển của bạn. Các mã sau đây có sử dụng OWIN để giải quyết UserManager dụ là một Service Locator anti-pattern:

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

Thay vì dựa vào OWIN để giải quyết phụ thuộc, tiêm dịch vụ cần thiết vào constructor của điều khiển của bạn và sử dụng IDependencyResolver để xây dựng bộ điều khiển dành cho bạn. This article minh họa cách sử dụng tính năng tiêm phụ thuộc trong ASP.NET Web API.

+1

Cảm ơn. Tôi không sử dụng OWIN để giải quyết các phụ thuộc. OWIN sử dụng nội bộ ApplicationUserManager và cố gắng lấy nó từ OwinContext. Vì vậy, làm cho OWIN biết về cá thể ApplicationUserManager là bắt buộc đối với OWIN để làm việc (hãy sửa tôi nếu tôi sai). Tôi không sử dụng mã bạn trích dẫn trong AccountController. AccountController đang nhận ApplicationUserManager thông qua quá trình tạo hàm dựng. Vì vậy, vấn đề vẫn còn. – su8898

+1

@ su8898 sau đó tôi có thể khuyên bạn nên xem [bài đăng trên blog này] (http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/) - có thể bạn ' sẽ tìm thấy một số mẫu mã hữu ích ở đó. –

+0

các ví dụ trong bài đăng trên blog sử dụng 'app.CreatePerOwinContext (() => DependencyResolver.Current.GetService ());' trong _ConfigureAuth_ vì nó là một dự án MVC. WebAPI có một triển khai khác nhau cho DependancyResolver. Ngay cả khi chúng ta sử dụng một phương thức như thế này, tôi nghĩ nó sẽ thất bại vì SimpleInjector sẽ không thể giải quyết 'ApplicationUserManager' trong _ConfigureAuth_. Tôi tự hỏi làm thế nào để tôi đi xung quanh vấn đề này! – su8898

Các vấn đề liên quan