C# ASP.NETMVC控制器注入问题

C# ASP.NETMVC控制器注入问题,c#,asp.net-web-api,dependency-injection,ninject,C#,Asp.net Web Api,Dependency Injection,Ninject,在我的ASP.NETMVCWebAPI项目中,我有接收参数的控制器构造函数,但没有无参数构造函数 使用Ninject注入依赖项: Ninject 3.2.0.0 3.2.2 Ninject.Web.Common 3.2.0.0 3.2.3 Ninject.Web.WebApi 3.2.0.0 3.2.4 当我调用API时,我得到: 中发生类型为“Ninject.ActivationException”的异常 Ninject.dll,但未在用户代码中处理 其他信息:激活IHubRepository

在我的ASP.NETMVCWebAPI项目中,我有接收参数的控制器构造函数,但没有无参数构造函数

使用Ninject注入依赖项:

Ninject 3.2.0.0 3.2.2 Ninject.Web.Common 3.2.0.0 3.2.3 Ninject.Web.WebApi 3.2.0.0 3.2.4 当我调用API时,我得到:

中发生类型为“Ninject.ActivationException”的异常 Ninject.dll,但未在用户代码中处理

其他信息:激活IHubRepository时出错

没有匹配的绑定可用,并且类型不可自绑定

激活路径:

2将依赖项IHubRepository注入参数 ResultController类型的构造函数的repHub

1请求ResultController

建议:

1确保已为IHubRepository定义了绑定

2如果绑定是在模块中定义的,请确保模块 已加载到内核中

3确保您没有意外创建多个内核

4如果您使用的是构造函数参数,请确保 名称与构造函数参数名称匹配

5如果使用自动模块加载,请确保搜索路径正确 并且过滤器是正确的

代码如下

控制器: HUB存储库
我不明白为什么它不能工作。

错误消息已经说明了可能的问题。 由于相关代码没有使用任何模块,因此可以忽略提及模块和模块加载=>2和5的选项。 因为您没有使用命名参数,所以也可以忽略4

对于数字1=>缺少绑定,您可能在不同的名称空间中有两个不同的IHubRepository,并且还为其中一个创建了绑定,但不是您正在请求的绑定。您有Hub.Dal.IHubRepository的绑定,但ResultController可能需要Foo.Bar.IHubRepository


要检查多个内核,您可以求助于服务定位器-将IKernel或IResolutionRoot注入控制器,而不是IHubRepository。在控制器构造函数和NinjectResolver控制器内部设置断点。当到达第一个断点时,在内核引用上设置对象ID。当点击第二个按钮时,检查是否有对象ID,是否相同。如果不是。。那么你就有了多个内核。

我绞尽脑汁了两天,添加、更改和删除对Ninject的引用,更改代码等等

解决方法是完全删除解决方案,并从TFS获得一个新的、清晰的get


代码中可能有一个令人讨厌的引用;我很难过。

你在设置Ninject时是否有拼写错误?正如您在这里看到的,错误是抱怨ISistemiHubRepository:将依赖项ISistemiHubRepository注入到ResultController类型构造函数的参数repHub中。它不是在抱怨IHubRepository@CodingYoshi对不起,修正了文本;遗憾的是,这不是一个与打字错误相关的问题。我觉得这与此有关:public HubRepositoryDbContext curCtx,因为它需要实例化一个参数。做一个测试,在那里放一个空构造函数,看看错误是否消失了,如果消失了,那么你就知道问题出在哪里了。然后,若要解决此问题,您可能需要在绑定期间使用此选项:.WithConstructorArgumentcurCtx、.new-DbContext/*或其他*@我尝试了CodingYoshi,但现在我遇到了一个上下文问题,因为无法在init this.Configuration.ProxyCreationEnabled=false上调用它;Riga 18:this.Configuration.LazyLoadingEnabled=false;Riga 19:IObjectContextAdapterthis.ObjectContext.CommandTimeout=90;好的,那么问题与构造函数有关?这是另一个错误,因此您需要考虑如何修复它。
public class ResultController : BaseHubController
{
    public ResultController(IHubRepository repHub)
    {
        _rep = repHub;
    }

    public async Task<IHttpActionResult> Get(string fileName)
    {
        if (String.IsNullOrEmpty(fileName))
            return BadRequest();


        return Ok();
    }
}
public sealed class NinjectResolver : NinjectScope, IDependencyResolver
{
    private IKernel kernel;

    public NinjectResolver(IKernel kernelParam)
        : base(kernelParam)
    {
        kernel = kernelParam;
        AddBindings();
    }
    public IDependencyScope BeginScope()
    {
        return new NinjectScope(kernel.BeginBlock());
    }

    public void AddBindings()
    {
        kernel.Bind<Hub.Dal.IHubRepository>().To<Hub.Dal.HubRepository>();
        kernel.Bind<System.Data.Entity.DbContext>().To<Hub.Dal.Context>();
    }
}

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 interface IHubRepository
{
    bool LogRequest(SHApiLog logData);
}
public class HubRepository : IHubRepository
{
    private DbContext _ctx;

    public HubRepository(DbContext curCtx)
    {
        this._ctx = curCtx;
    }

    public bool LogRequest(SHApiLog logData)
    {
        try
        {
            _ctx.Set<SHApiLog>().Add(logData);
            _ctx.SaveChanges();
        }
        catch (Exception)
        {
            return false;
        }

        return true;
    }
}