如何使用DI容器时owinstartup问题,怎么解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用DI容器时owinstartup问题,怎么解决相关的知识,希望对你有一定的参考价值。
参考技术A It's a Web API 2 project.When I implement DI using Ninject, I got an error message
An error occurred when trying to create a controller of type 'TokenController'. Make sure that the controller has a parameterless public constructor.
[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);
When I add <add key="owin:AutomaticAppStartup" value="false" /> to web.config
Ninject works fine, but Startup.OAuthBearerOptions.AccessTokenFormat becomes to null
How to use DI container with OWIN?
UPDATE
Implement IDependencyResolver and use the WebAPI Dependency Resolver as below
public void ConfigureWebApi(IAppBuilder app)
HttpConfiguration config = new HttpConfiguration();
config.DependencyResolver = new NinjectDependencyResolver(NinjectWebCommon.CreateKernel());
app.UseWebApi(config);
NinjectDependencyResolver
In Simple Injector case
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
对spring IOC容器DI的理解
1.IOC是什么?
IOC(控制反转)是一种管理bean的容器,它的本质是对象工厂(接口)。
在应用程序中的组件需要获取资源时,传统的方式是组件主动从容器中获取所需的资源,在这种模式下,开发人员需要知道具体容器中资源的获取方式,增加了学习成本,降低了开发效率。
反转控制思想改由容器主动将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接受资源的方法即可。
2.IOC容器在spring中的实现
(1)在通过IOC容器读取Bean实例前,先需要将IOC容器本身实例化。
(2)Spring提供的IOC实例化的两种实现:
BeanFactory:IOC容器最基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员的。
ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring使用者。
3.ApplicationContext主要实现类
(1)ClassPathXmlApplicationContext:对应类路径下的xml文件
(2)FileSystemXMLApplicationContext:对应文件系统中的xml文件
4.ConfigurableApplicationContext
(1)ApplicationContext的子接口,包含一些扩展方法
(2)refresh()和close()让ApplicationContext具有启动、关闭、刷新上下文的能力
5.WebApplicationContext
(1)专门问web应用而准备,它允许相对于web根目录的路径中完成初始化工作
6.给Bean的属性赋值
(1)依赖注入
setter();属性赋值,使用setter方法,配置文件中属性名要与java类中setter方法名一致
构造器;1.使用name属性指定具体参数值 2.默认顺序 3.通过下标调整对应参数位置 4.同类型进行参数匹配
接口;
(2)p名称空间
<bean
id="studentSuper"
class="com.atguigu.helloworld.bean.Student"
p:studentId="2002" p:stuName="Jerry2016" p:age="18" />
以上是关于如何使用DI容器时owinstartup问题,怎么解决的主要内容,如果未能解决你的问题,请参考以下文章