vieja usada textiles telas sirve ropa reciclar reciclaje recicla que proceso malo mal hacer estado donde desechos con centro botar acopio c# asp.net-web-api dependency-injection ninject owin

c# - usada - reciclaje de telas proceso



Cómo usar el contenedor DI cuando OwinStartup (3)

Actualizar

Esto es ahora más sencillo gracias al paquete de 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; } }

He actualizado la wiki en consecuencia.

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

Las tres opciones de alojamiento.

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

Es un proyecto de Web API 2.

Cuando implemente DI usando Ninject, recibí un mensaje de error

Se produjo un error al intentar crear un controlador de tipo ''TokenController''. Asegúrese de que el controlador tenga un constructor público sin parámetros.

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

Cuando agrego <add key="owin:AutomaticAppStartup" value="false" /> a web.config

Ninject funciona bien, pero Startup.OAuthBearerOptions.AccessTokenFormat pasa a ser nulo

¿Cómo usar el contenedor DI con OWIN?

ACTUALIZAR

Implemente IDependencyResolver y utilice el Resolutor de dependencias de WebAPI como se muestra a continuación.

public void ConfigureWebApi(IAppBuilder app) { HttpConfiguration config = new HttpConfiguration(); config.DependencyResolver = new NinjectDependencyResolver(NinjectWebCommon.CreateKernel()); app.UseWebApi(config); }

NinjectDependencyResolver

En el caso de Simple Injector

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


Es posible que desee echar un vistazo a esta publicación de blog .

Está usando Unity pero debería ser el mismo.

Básicamente, use el Resolutor de Dependencia de WebAPI. Asegúrese de que todo esté mapeado correctamente y que esté bien.

Si después de configurar su DI aún tiene problemas con su token de OAuth, hágamelo saber.

Aclamaciones


Usamos el paquete estándar ninject.MVC5 instalado con nuget

PM> install-package ninject.MVC5

Luego configuramos nuestros enlaces como tal.

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") ));

Es posible que deba ajustar dependiendo de cuánto haya personalizado su modelo de usuario. Por ejemplo, el enlace de tienda de usuario puede ser algo así como.

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

También se puede establecer cualquier configuración del administrador de usuario, es decir, las políticas de contraseñas en el constructor del administrador de usuarios.

Anteriormente, esto podría encontrarse en el método create en la muestra, ya no será necesario. también ahora puede deshacerse de las llamadas contextuales ya que ninject manejará la resolución por usted.