2013-11-05 3 views
58

यह एक वेब एपीआई 2 प्रोजेक्ट है।ओ कंटेनर का उपयोग कैसे करें जब OwinStartup

जब मैं Ninject का उपयोग कर डि लागू, मैंने एक त्रुटि संदेश

जब प्रकार का एक नियंत्रक 'TokenController' बनाने का प्रयास करते समय कोई त्रुटि उत्पन्न हो गया। सुनिश्चित करें कि नियंत्रक के पास पैरामीटर रहित सार्वजनिक कन्स्ट्रक्टर है।

[assembly: OwinStartup(typeof(Web.Startup))] 

namespace Web 
{ 
    public partial class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      ConfigureAuth(app); 
      ConfigureWebApi(app); 
     } 
    } 
} 

public class TokenController : ApiController 
{ 

    private IUserService _userService; 

    public TokenController(IUserService userService) 
    { 
     this._userService = userService; 
    } 

    [Route("api/Token")] 
    public HttpResponseMessage PostToken(UserViewModel model) 
    { 
     if (_userService.ValidateUser(model.Account, model.Password)) 
     { 
      ClaimsIdentity identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType); 
      identity.AddClaim(new Claim(ClaimTypes.Name, model.Account)); 
      AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties()); 
      var currentUtc = new SystemClock().UtcNow; 
      ticket.Properties.IssuedUtc = currentUtc; 
      ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30)); 
      return new HttpResponseMessage(HttpStatusCode.OK) 
      { 
       Content = new ObjectContent<object>(new 
       { 
        UserName = model.Account, 
        AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket) 
       }, Configuration.Formatters.JsonFormatter) 
      }; 
     } 

     return new HttpResponseMessage(HttpStatusCode.BadRequest); 
    } 
} 

जब मैं <add key="owin:AutomaticAppStartup" value="false" /> जोड़ने web.config को

Ninject काम करता है ठीक, लेकिन Startup.OAuthBearerOptions.AccessTokenFormat शून्य पर

कैसे Owin साथ डि कंटेनर का उपयोग करना हो जाता है?

अद्यतन

IDependencyResolver कार्यान्वित करके

public void ConfigureWebApi(IAppBuilder app) 
{ 
    HttpConfiguration config = new HttpConfiguration(); 

    config.DependencyResolver = new NinjectDependencyResolver(NinjectWebCommon.CreateKernel()); 

    app.UseWebApi(config); 
} 

NinjectDependencyResolver


नीचे के रूप में वेबएपीआई निर्भरता रिज़ॉल्वर का उपयोग सरल इंजेक्टर मामले में

public void ConfigureWebApi(IAppBuilder app) 
{ 
    HttpConfiguration config = new HttpConfiguration(); 

    var container = new Container(); 
    container.Register<IUserService, UserService>(); 
    config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 

    app.UseWebApi(config); 
} 

SimpleInjectorWebApiDependencyResolver

+0

वहाँ एक कारण है कि आप अपने नियंत्रक को एक खाली निर्माता नहीं जोड़ सकते है? –

+0

@ निकोलई सैमटेलैज मैं खाली कन्स्ट्रक्टर में निर्भरता लागू कर चुका हूं, मैं सिर्फ यह जानना चाहता हूं कि इस मामले में डी कंटेनर का उपयोग कैसे करें –

+0

[एक प्रोजेक्ट है] (https://github.com/DotNetDoodle/DotNetDoodle.Owin.Dependencies) जो इस समर्थन को प्रदान करता है, लेकिन शायद आपको अपने आप को निचोड़ने के लिए एडाप्टर लिखना होगा क्योंकि यह केवल ऑटोफैक के लिए बॉक्स कार्यान्वयन से बाहर प्रदान करता है। –

उत्तर

32

आप this blog post पर एक नज़र डालें कर सकते हैं।

यह एकता का उपयोग कर रहा है लेकिन इसे समाप्त होना चाहिए।

मूल रूप से, वेबएपीआई निर्भरता रिजॉल्वर का उपयोग करें। सुनिश्चित करें कि सब कुछ ठीक से मैप किया गया है और यह ठीक होना चाहिए।

यदि आपके DI को स्थापित करने के बाद भी आपको अपने ओथ टोकन के साथ समस्या है, तो मुझे बताएं।

चीयर्स

+0

मैं वेबएपीआई निर्भरता रिजॉल्वर का उपयोग करता हूं और यह काम करता है, आपके उत्तर के लिए धन्यवाद! –

2

हम मानक ninject.MVC5 पैकेज के साथ nuget

PM> स्थापित पैकेज ninject.MVC5

फिर हम तो जैसे हमारे बाइंडिंग कॉन्फ़िगर स्थापित का उपयोग करें।

kernel.Bind<IDbContext, DbContext>() 
    .To<BlogContext>() 
    .InRequestScope(); 

kernel.Bind<IUserStore<User>>() 
    .To<UserStore<User>>() 
    .InRequestScope(); 

kernel.Bind<IDataProtectionProvider>() 
    .To<DpapiDataProtectionProvider>() 
    .InRequestScope() 
    .WithConstructorArgument("ApplicationName"); 

kernel.Bind<ApplicationUserManager>().ToSelf().InRequestScope() 
    .WithPropertyValue("UserTokenProvider", 
     new DataProtectorTokenProvider<User>(
      kernel.Get<IDataProtectionProvider>().Create("EmailConfirmation") 
      )); 

आपको अपने उपयोगकर्ता मॉडल को कितना अनुकूलित किया गया है इस पर निर्भर रहने की आवश्यकता हो सकती है। उदाहरण के लिए उपयोगकर्ता स्टोर बाध्यकारी कुछ ऐसा हो सकता है।

kernel.Bind<IUserStore<User, int>>() 
     .To<IntUserStore>().InRequestScope(); 

इसके अलावा उपयोगकर्ता मैनेजर की किसी भी सेटिंग की आवश्यकता है यानी पासवर्ड नीतियों को आपके उपयोगकर्ता प्रबंधक कन्स्ट्रक्टर में सेट किया जा सकता है।

इससे पहले यह नमूना में निर्माण विधि में पाया जा सकता है, अब आपको इसकी आवश्यकता नहीं होगी। अब भी आप ओविन से संदर्भ कॉल प्राप्त कर सकते हैं क्योंकि निंजा आपके लिए संकल्प संभाल लेगा।

+0

इस बात की बात है कि आंतरिक रूप से कुछ पहचान सामग्री में ओविन पर निर्भरता है (यानी यह OwinContext.Get() को कॉल करता है)। क्या आपने इससे कोई अजीबता या समस्याएं देखी हैं? – JasonCoder

+0

@ जेसनकोडर नहीं कह सकता कि हमने कुछ समय से उत्पादन में परियोजनाओं पर इस सेटअप का उपयोग कर किसी भी मुद्दे को मारा है। – jps

17

अद्यतन

यह अब और अधिक सीधे आगे Nuget पैकेज Ninject.Web.WebApi.OwinHost करने के लिए धन्यवाद किया गया है:

Startup.cs

using Ninject; 
using Ninject.Web.Common.OwinHost; 
using Ninject.Web.WebApi.OwinHost; 
using Owin; 
using System.Web.Http; 

namespace Xxx 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var config = new HttpConfiguration(); 
      config.MapHttpAttributeRoutes(); 
      config.Routes.MapHttpRoute("DefaultApi", "myservice/{controller}/{id}", new { id = RouteParameter.Optional }); 

      app.UseNinjectMiddleware(CreateKernel); 
      app.UseNinjectWebApi(config); 
     } 
    } 
    public static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 

     kernel.Bind<IMyService>().To<MyService>(); 
     return kernel; 
    } 
} 

मैं विकि तदनुसार अपडेट कर दिया है ।

https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application

तीनों होस्टिंग विकल्प।

https://github.com/ninject/Ninject.Web.WebApi/wiki/Setting-up-an-mvc-webapi-application

+1

मैंने इसे एक बहुत ही सरल, उदाहरण ओविन होस्टेड एप्लिकेशन के लिए आजमाया है और यह केवल पहली कॉल के लिए काम करता है। बाद की कॉल त्रुटियों का कारण बनती है: "सुनिश्चित करें कि नियंत्रक के पास पैरामीटर रहित सार्वजनिक कन्स्ट्रक्टर है।"। कोई विचार क्यों? –

संबंधित मुद्दे