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