OwinStartup시 DI 컨테이너 사용 방법
Web API 2 프로젝트입니다.
Ninject를 사용하여 DI를 구현할 때 오류 메시지가 나타납니다.
'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 은 null이됩니다.
OWIN에서 DI 컨테이너를 사용하는 방법은 무엇입니까?
최신 정보
IDependencyResolver를 구현하고, 같이 WebAPI Dependency Resolver를 사용합니다.
public void ConfigureWebApi(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.DependencyResolver = new NinjectDependencyResolver(NinjectWebCommon.CreateKernel());
app.UseWebApi(config);
}
간단한 인젝터 케이스
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
이 블로그 게시물을 살펴볼 수 있습니다 .
일치를 사용하고 결국 동일해야합니다.
기본적으로 WebAPI 종속성 확인자를 사용합니다. 모든 것이 올바르게 매핑되었는지 확인하고 정상이어야합니다.
DI를 설정 한 후에도 OAuth 토큰에 문제가있는 경우 알려주세요.
건배
최신 정보
이제 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
우리는 nuget과 함께 설치된 표준 ninject.MVC5 패키지를 사용합니다.
PM> install-package 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();
또한 필요한 사용자 관리자 설정, 즉 암호 정책은 사용자 관리자 생성자에서 설정할 수 있습니다.
이전에는 샘플의 create 메서드에서 찾을 수 있었지만 더 이상 필요하지 않습니다. 또한 이제 ninject가 해결을 처리하므로 owin get 컨텍스트 호출을 제거 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/19781970/how-to-use-di-container-when-owinstartup
'ProgramingTip' 카테고리의 다른 글
CSS에서 색상 코드 대신 색상 이름을 사용하는 데 단점이 있습니까? (0) | 2020.11.25 |
---|---|
JUnit 테스트 케이스에서 자원 파일을 제거 수 없음 (0) | 2020.11.25 |
For 루프에서 포크 () (0) | 2020.11.25 |
Azure DevOps, YAML 릴리스 파이프 라인? (0) | 2020.11.25 |
둘 이상의 항목이 이미 발견 된 경우에도 Enumerable.Single ()이 모든 요소를 반복하는 이유는 무엇입니까? (0) | 2020.11.25 |