C# ASP.NETMVC控制器注入问题
在我的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存储库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
我不明白为什么它不能工作。错误消息已经说明了可能的问题。 由于相关代码没有使用任何模块,因此可以忽略提及模块和模块加载=>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;
}
}