ASP .NET MVC 控制器注入问题
ASP .NET MVC Controller Injection issue
在我的 ASP .NET MVC WebApi 项目中,我有接收参数的控制器构造函数,我没有无参数构造函数。
使用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 时,我得到:
An exception of type 'Ninject.ActivationException' occurred in
Ninject.dll but was not handled in user code
Additional information: Error activating IHubRepository
No matching bindings are available, and the type is not self-bindable.
Activation path:
2) Injection of dependency IHubRepository into parameter
repHub of constructor of type ResultController
1) Request for ResultController
Suggestions:
1) Ensure that you have defined a binding for IHubRepository.
2) If the binding was defined in a module, ensure that the module
has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel.
4) If you are using constructor arguments, ensure that the parameter
name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path
and filters are correct.
代码如下
控制器:
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();
}
}
Ninject解析器
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;
}
}
IHub 存储库
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;
}
}
我不明白为什么它不起作用。
错误消息已经说明了可能存在的问题。
由于相关代码未使用任何模块,因此您可以忽略提及模块和模块加载的选项 => 2) 和 5)。
由于您没有使用命名参数,因此您也可以忽略 4)
对于数字 1) => 缺少绑定,也有可能您有两个不同的 IHubRepository
(在不同的命名空间中)并且还为其中之一创建了绑定,但不是您正在创建的绑定要求。您有 Hub.Dal.IHubRepository
的绑定,但也许 ResultController
想要 Foo.Bar.IHubRepository
.
要检查多个内核,您可以求助于服务定位器 - 将 IKernel
(或 IResolutionRoot
)注入控制器而不是 IHubRepository
。在 NinjectResolver
的控制器构造函数和控制器内部设置断点。当到达第一个断点时,在内核引用上设置对象 ID。当点击第二个时,检查是否有对象 ID,是否相同。如果不是..那么你有多个内核。
我撞了两天脑袋,通过添加、更改和删除对 Ninject 的引用、更改代码等等..
通过完全删除解决方案并从 TFS 获取新的、清晰的解决方案。
可能代码中某处有讨厌的引用;我好难过
在我的 ASP .NET MVC WebApi 项目中,我有接收参数的控制器构造函数,我没有无参数构造函数。
使用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 时,我得到:
An exception of type 'Ninject.ActivationException' occurred in Ninject.dll but was not handled in user code
Additional information: Error activating IHubRepository
No matching bindings are available, and the type is not self-bindable.
Activation path:
2) Injection of dependency IHubRepository into parameter repHub of constructor of type ResultController
1) Request for ResultController
Suggestions:
1) Ensure that you have defined a binding for IHubRepository.
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel.
4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path and filters are correct.
代码如下
控制器:
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();
}
}
Ninject解析器
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;
}
}
IHub 存储库
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;
}
}
我不明白为什么它不起作用。
错误消息已经说明了可能存在的问题。 由于相关代码未使用任何模块,因此您可以忽略提及模块和模块加载的选项 => 2) 和 5)。 由于您没有使用命名参数,因此您也可以忽略 4)
对于数字 1) => 缺少绑定,也有可能您有两个不同的 IHubRepository
(在不同的命名空间中)并且还为其中之一创建了绑定,但不是您正在创建的绑定要求。您有 Hub.Dal.IHubRepository
的绑定,但也许 ResultController
想要 Foo.Bar.IHubRepository
.
要检查多个内核,您可以求助于服务定位器 - 将 IKernel
(或 IResolutionRoot
)注入控制器而不是 IHubRepository
。在 NinjectResolver
的控制器构造函数和控制器内部设置断点。当到达第一个断点时,在内核引用上设置对象 ID。当点击第二个时,检查是否有对象 ID,是否相同。如果不是..那么你有多个内核。
我撞了两天脑袋,通过添加、更改和删除对 Ninject 的引用、更改代码等等..
通过完全删除解决方案并从 TFS 获取新的、清晰的解决方案。
可能代码中某处有讨厌的引用;我好难过