C# Ninject和ASP.NET Web API

C# Ninject和ASP.NET Web API,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,在我设置问题之前,您应该知道我从该页面获取了当前代码: 我正试图使用上面网站上的IDependencyResolver适配器在我的应用程序中使用ASP.NET Web API和Ninject 我创建了所有代码,就像它在网站上显示的一样,它可以工作,但当我加载我的应用程序时,我的常规控制器失败并显示此错误: [MissingMethodException:没有为此对象定义无参数构造函数。] [InvalidOperationException:尝试创建“AccountManager.Contro

在我设置问题之前,您应该知道我从该页面获取了当前代码:

我正试图使用上面网站上的IDependencyResolver适配器在我的应用程序中使用ASP.NET Web API和Ninject

我创建了所有代码,就像它在网站上显示的一样,它可以工作,但当我加载我的应用程序时,我的常规控制器失败并显示此错误:

[MissingMethodException:没有为此对象定义无参数构造函数。]

[InvalidOperationException:尝试创建“AccountManager.Controllers.HomeController”类型的控制器时出错…

因此,我似乎可以将Ninject与常规控制器或Web API控制器一起使用,但不能两者都使用(

这是我的密码:

NinjectResolver.cs

public class NinjectResolver : NinjectScope, IDependencyResolver
{
    private IKernel _kernel;

    public NinjectResolver(IKernel kernel)
        : base(kernel)
    {
        _kernel = kernel;
    }

    public IDependencyScope BeginScope()
    {
        return new NinjectScope(_kernel.BeginBlock());
    }
}
public class NinjectScope : IDependencyScope
{
    protected IResolutionRoot resolutionRoot;

    public NinjectScope(IResolutionRoot kernel)
    {
        resolutionRoot = kernel;
    }

    public object GetService(Type serviceType)
    {
        IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        return resolutionRoot.Resolve(request).SingleOrDefault();
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        return resolutionRoot.Resolve(request).ToList();
    }

    public void Dispose()
    {
        IDisposable disposable = (IDisposable)resolutionRoot;
        if (disposable != null) disposable.Dispose();
        resolutionRoot = null;
    }
}
public class MvcApplication : System.Web.HttpApplication
{
    private void SetupDependencyInjection()
    {
        //create Ninject DI Kernel
        IKernel kernel = new StandardKernel();

        //register services with Ninject DI container
        RegisterServices(kernel);

        //tell asp.net mvc to use our Ninject DI Container
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
    }
}
public class AccountingController : ApiController
{
    private ICustomerService _customerService;

    public AccountingController(ICustomerService service)
    {
        _customerService = service;
    }

    // GET /api/<controller>/5
    public string Get(int id)
    {
        return "value";
    }
}
NinjectScope.cs

public class NinjectResolver : NinjectScope, IDependencyResolver
{
    private IKernel _kernel;

    public NinjectResolver(IKernel kernel)
        : base(kernel)
    {
        _kernel = kernel;
    }

    public IDependencyScope BeginScope()
    {
        return new NinjectScope(_kernel.BeginBlock());
    }
}
public class NinjectScope : IDependencyScope
{
    protected IResolutionRoot resolutionRoot;

    public NinjectScope(IResolutionRoot kernel)
    {
        resolutionRoot = kernel;
    }

    public object GetService(Type serviceType)
    {
        IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        return resolutionRoot.Resolve(request).SingleOrDefault();
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        return resolutionRoot.Resolve(request).ToList();
    }

    public void Dispose()
    {
        IDisposable disposable = (IDisposable)resolutionRoot;
        if (disposable != null) disposable.Dispose();
        resolutionRoot = null;
    }
}
public class MvcApplication : System.Web.HttpApplication
{
    private void SetupDependencyInjection()
    {
        //create Ninject DI Kernel
        IKernel kernel = new StandardKernel();

        //register services with Ninject DI container
        RegisterServices(kernel);

        //tell asp.net mvc to use our Ninject DI Container
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
    }
}
public class AccountingController : ApiController
{
    private ICustomerService _customerService;

    public AccountingController(ICustomerService service)
    {
        _customerService = service;
    }

    // GET /api/<controller>/5
    public string Get(int id)
    {
        return "value";
    }
}
AccountingController.cs

public class NinjectResolver : NinjectScope, IDependencyResolver
{
    private IKernel _kernel;

    public NinjectResolver(IKernel kernel)
        : base(kernel)
    {
        _kernel = kernel;
    }

    public IDependencyScope BeginScope()
    {
        return new NinjectScope(_kernel.BeginBlock());
    }
}
public class NinjectScope : IDependencyScope
{
    protected IResolutionRoot resolutionRoot;

    public NinjectScope(IResolutionRoot kernel)
    {
        resolutionRoot = kernel;
    }

    public object GetService(Type serviceType)
    {
        IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        return resolutionRoot.Resolve(request).SingleOrDefault();
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        return resolutionRoot.Resolve(request).ToList();
    }

    public void Dispose()
    {
        IDisposable disposable = (IDisposable)resolutionRoot;
        if (disposable != null) disposable.Dispose();
        resolutionRoot = null;
    }
}
public class MvcApplication : System.Web.HttpApplication
{
    private void SetupDependencyInjection()
    {
        //create Ninject DI Kernel
        IKernel kernel = new StandardKernel();

        //register services with Ninject DI container
        RegisterServices(kernel);

        //tell asp.net mvc to use our Ninject DI Container
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
    }
}
public class AccountingController : ApiController
{
    private ICustomerService _customerService;

    public AccountingController(ICustomerService service)
    {
        _customerService = service;
    }

    // GET /api/<controller>/5
    public string Get(int id)
    {
        return "value";
    }
}
公共类AccountingController:ApicController
{
私人ICCustomerService(用户服务);;
公共会计控制员(ICCustomerService)
{
_客户服务=服务;
}
//GET/api//5
公共字符串Get(int-id)
{
返回“值”;
}
}

我有一个Web API项目,使用与strathweb完全相同的解决方案,所以我只是在项目中添加了一个普通控制器,它确实可以工作。它本身对您没有很大帮助,因此我将详细介绍我得到的设置:

我安装了以下软件包(在IOC方面):

  • Ninject 3.0.1.10
  • Ninject MVC 3.0.0.6
  • Ninject.Web.Common 3.0.0.7
  • WebActivator 1.5.1
我的Global.asax.cs文件中完全没有关于Ninject的任何内容,而是使用安装Ninject时在App_Start中自动创建的NinjectWebCommon.cs文件。我不知道全局文件中的代码是否意味着Ninject在项目中没有正确设置

以下是NinjectWebCommon.cs中的代码:

    public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);

        GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);

        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IUserRepository>().To<UserRepository>().InSingletonScope();
        kernel.Bind<IUserManager>().To<UserManager>();
    }        
}

这适用于我的控制器和APIController。

在调用
RegisterServices(内核);
之前,在
CreateKernel()方法中插入以下代码行

GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
您还需要使用下面的代码,我更喜欢在同一个类中定义它

public class NinjectResolver : NinjectScope, IDependencyResolver
{
    private IKernel _kernel;
    public NinjectResolver(IKernel kernel)  : base(kernel)
    {
        _kernel = kernel;
    }
    public IDependencyScope BeginScope()
    {
        return new NinjectScope(_kernel.BeginBlock());
    }
}

public class NinjectScope : IDependencyScope
{
    protected IResolutionRoot resolutionRoot;
    public NinjectScope(IResolutionRoot kernel)
    {
        resolutionRoot = kernel;
    }
    public object GetService(Type serviceType)
    {
        IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        return resolutionRoot.Resolve(request).SingleOrDefault();
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {
        IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        return resolutionRoot.Resolve(request).ToList();
    }
    public void Dispose()
    {
        IDisposable disposable = (IDisposable)resolutionRoot;
        if (disposable != null) disposable.Dispose();
        resolutionRoot = null;
    }
}
公共类NinjectResolver:NinjectScope,IDependencyResolver
{
私有IKernel_内核;
公共NinjectResolver(IKernel内核):基本(内核)
{
_内核=内核;
}
公共IDependencyScope BeginScope()
{
返回新的NinjectScope(_kernel.BeginBlock());
}
}
公共类NinjectScope:IDependencyScope
{
受保护的IResolutionRoot resolutionRoot;
公共NinjectScope(IResolutionRoot内核)
{
resolutionRoot=内核;
}
公共对象GetService(类型serviceType)
{
IRequest request=resolutionRoot.CreateRequest(serviceType,null,新参数[0],true,true);
返回resolutionRoot.Resolve(请求).SingleOrDefault();
}
公共IEnumerable GetServices(类型serviceType)
{
IRequest request=resolutionRoot.CreateRequest(serviceType,null,新参数[0],true,true);
返回resolutionRoot.Resolve(request.ToList();
}
公共空间处置()
{
IDisposable一次性=(IDisposable)resolutionRoot;
if(disposable!=null)Dispose.Dispose();
resolutionRoot=null;
}
}
运行它,它应该会工作。这对我有用,我希望它对你也有用

进一步阅读:


以前没有使用过Ninject,但是您有没有理由不能在Ninject试图注入的类型上添加无参数构造函数?@Charleh:这会破坏IoC容器的用途。