Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WebApi DI不工作_C#_Asp.net Web Api_Ninject - Fatal编程技术网

C#WebApi DI不工作

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

你好,我需要帮助。我在这第二天苦苦挣扎,找不到问题的根源。我正在使用令牌授权、身份和ninject开发web api

这是我的内核:

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