C#WebApi DI不工作
你好,我需要帮助。我在这第二天苦苦挣扎,找不到问题的根源。我正在使用令牌授权、身份和ninject开发web api 这是我的内核:C#WebApi DI不工作,c#,asp.net-web-api,ninject,C#,Asp.net Web Api,Ninject,你好,我需要帮助。我在这第二天苦苦挣扎,找不到问题的根源。我正在使用令牌授权、身份和ninject开发web api 这是我的内核: public IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Bind<AppContext>().ToSelf().InRequestScope(); kernel.Bind(x => { x.Fro
public IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<AppContext>().ToSelf().InRequestScope();
kernel.Bind(x => { x.From(typeof(UserService).Assembly).SelectAllClasses().EndingWith("Service").BindDefaultInterface(); });
kernel.Bind(typeof(IUserStore<AppIdentityUser>)).To(typeof(UserStore<AppIdentityUser>)).InRequestScope()
.WithConstructorArgument("context", kernel.Get<AppContext>());
kernel.Bind(typeof(UserManager<AppIdentityUser>)).To(typeof(UserManager<AppIdentityUser>)).InRequestScope()
.WithConstructorArgument("store", kernel.Get<IUserStore<AppIdentityUser>>());
kernel.Bind(typeof(IRoleStore<IdentityRole, string>)).To(typeof(RoleStore<IdentityRole>)).InRequestScope().WithConstructorArgument("context", kernel.Get<AppContext>());
kernel.Bind(typeof(RoleManager<IdentityRole>)).To(typeof(RoleManager<IdentityRole>)).InRequestScope().WithConstructorArgument("store", kernel.Get<IRoleStore<IdentityRole, string>>());
kernel.Bind<IOAuthAuthorizationServerProvider>().To<AuthorizationServerProvider>();
kernel.Bind<IOAuthAuthorizationServerOptions>().To<MyOAuthAuthorizationServerOptions>();
return kernel;
}
这是我的服务:
public UserService(UserManager<AppIdentityUser> userMenager, RoleManager<IdentityRole> roleManager)
{
this._userMenager = userMenager;
this._roleManager = roleManager;
}
public AppIdentityUser GetUser(string name, string password)
{
return _userMenager.Find(name, password); // here I recive error on second time
}
公共用户服务(用户管理器用户管理器、角色管理器角色管理器)
{
这是.\u userMenager=userMenager;
这个。_rolemanger=rolemanger;
}
public AppIdentityUser GetUser(字符串名称、字符串密码)
{
return _userMenager.Find(name,password);//这里我第二次收到错误
}
问题是,这种方法只能工作一次。当我打开应用程序并执行一个get操作时,它会在第二次尝试时工作。几秒钟后,我得到一个异常,用户存储中的上下文被释放。我怀疑我的ninject配置有问题,但没有看到任何错误
编辑:这是我的Owin启动课程
public void Configuration(IAppBuilder app)
{
config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.EnableCors();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
var kernel = ConfigureNinject(app);
ConfigureOAuth(app, kernel);
config.DependencyResolver = new NinjectResolver(kernel);
//app.UseWebApi(config);
app.UseNinjectMiddleware(() => kernel);
app.UseNinjectWebApi(config);
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutoMapperConfiguration.Configure();
}
public void ConfigureOAuth(IAppBuilder app, IKernel kernel)
{
app.UseOAuthBearerTokens(kernel.Get<IOAuthAuthorizationServerOptions>().GetOptions());
}
public void配置(IAppBuilder应用程序)
{
config=新的HttpConfiguration();
config.maphttpAttribute路由();
config.EnableCors();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
config.SuppressDefaultHostAuthentication();
添加(新的HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
var kernel=ConfigureNinject(应用程序);
配置OAuth(应用程序、内核);
config.DependencyResolver=新的NinjectResolver(内核);
//app.UseWebApi(配置);
app.usenject中间件(()=>内核);
app.useinjectwebapi(配置);
RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutoMapperConfiguration.Configure();
}
public void ConfigureOAuth(IAppBuilder应用程序,IKernel内核)
{
使用OAuthBealerTokens(kernel.Get().GetOptions());
}
我只想说,我会诚实地将您的RoleManager
包装在RoleManager工厂
中,这将使DI变得更容易。。。我为我所有的项目都这么做,而且我倾向于更进一步,但有一个适配器围绕着它们,这样就不会将EF泄露到我的应用程序中。(但这是优惠)你能举个例子吗?现在在我的应用程序中,我在身份存储中接收到随机上下文处理(在另一个服务上,dbcontext被注入,因为它应该只有身份存储是有问题的),我完全不知道该怎么做。啊,是的,我可以肯定地为你提供一些代码,给我20分钟20分钟的时间…我想说,老实说,我会将您的RoleManager
包装在RoleManagerFactory
中,这将使DI变得更容易。。。我为我所有的项目都这么做,而且我倾向于更进一步,但有一个适配器围绕着它们,这样就不会将EF泄露到我的应用程序中。(但这是优惠)你能举个例子吗?现在在我的应用程序中,我接收到身份存储中的随机上下文处理(在另一个服务上,dbcontext被注入,因为它应该只有身份存储是有问题的),我完全不知道该怎么做。啊,是的,我可以肯定地为你提供一些代码,给我20分钟长20分钟。。。
public void Configuration(IAppBuilder app)
{
config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.EnableCors();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
var kernel = ConfigureNinject(app);
ConfigureOAuth(app, kernel);
config.DependencyResolver = new NinjectResolver(kernel);
//app.UseWebApi(config);
app.UseNinjectMiddleware(() => kernel);
app.UseNinjectWebApi(config);
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutoMapperConfiguration.Configure();
}
public void ConfigureOAuth(IAppBuilder app, IKernel kernel)
{
app.UseOAuthBearerTokens(kernel.Get<IOAuthAuthorizationServerOptions>().GetOptions());
}