ProgramingTip

OwinStartup시 DI 컨테이너 사용 방법

bestdevel 2020. 11. 25. 08:15
반응형

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

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


이 블로그 게시물을 살펴볼 수 있습니다 .

일치를 사용하고 결국 동일해야합니다.

기본적으로 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

반응형