【发布时间】:2013-07-04 05:00:38
【问题描述】:
这是踪迹:
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Type 'ProjectName.Web.Api.Controllers.ContinentsController' does not have a default constructor
</ExceptionMessage>
<ExceptionType>System.ArgumentException</ExceptionType>
<StackTrace>
at System.Linq.Expressions.Expression.New(Type type)
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
</StackTrace>
</Error>
我觉得这很奇怪,因为 public class UsersController : ApiController { ... } 工作得很好。我比较了2个控制器,所有的设置和结构都差不多。
我正在使用Ninject,我的系统设置类似于Jamie KurtzAsp.Net Mvc 4 and the Web Api: Building a REST Service from Start to Finish。
从堆栈跟踪中,是否有人能够发现问题以及如何解决它?谢谢!
应要求。
大陆控制器
[LoggingNHibernateSession]
public class ContinentsController : ApiController
{
private readonly ISession _session;
private readonly IContinentMapper _continentMapper;
private readonly IHttpContinentFetcher _httpContinentFetcher;
private readonly IDateTime _dateTime;
public ContinentsController(ISession session, IContinentMapper continentMapper, IHttpContinentFetcher continentFetcher, IDateTime dateTime)
{
_session = session;
_continentMapper = continentMapper;
_httpContinentFetcher = continentFetcher;
_dateTime = dateTime;
}
public IEnumerable<Continent> Get()
{
var continents = _session
.Query<Data.Model.Continent>()
.Select(_continentMapper.CreateContinent)
.ToList();
return continents;
}
public Continent Get(long id)
{
var modelContinent = _httpContinentFetcher.GetContinent(id);
var continent = _continentMapper.CreateContinent(modelContinent);
return continent;
}
}
UsersController:工作得很好。
public class UsersController : ApiController
{
private readonly ISession _session;
private readonly IUserManager _userManager;
private readonly IUserMapper _userMapper;
private readonly IHttpUserFetcher _userFetcher;
public UsersController(
IUserManager userManager,
IUserMapper userMapper,
IHttpUserFetcher userFetcher,
ISession session)
{
_userManager = userManager;
_userMapper = userMapper;
_userFetcher = userFetcher;
_session = session;
}
[Queryable]
public IQueryable<Data.Model.User> Get()
{
return _session.Query<Data.Model.User>();
}
[LoggingNHibernateSession]
public User Get(Guid id)
{
var user = _userFetcher.GetUser(id);
return _userMapper.CreateUser(user);
}
}
我正在使用NinjectWebCommon.cs,在其中,我有这个和其他一些默认方法。:
private static void RegisterServices(IKernel kernel)
{
var containerConfigurator = new NinjectConfigurator();
containerConfigurator.Configure(kernel);
GlobalConfiguration.Configuration.MessageHandlers.Add(kernel.Get<BasicAuthenticationMessageHandler>());
}
然后我有NinjectConfigurator.cs:
public class NinjectConfigurator
{
......
private void AddBindings(IKernel container)
{
.....
container.Bind<IDateTime>().To<DateTimeAdapter>();
container.Bind<IDatabaseValueParser>().To<DatabaseValueParser>();
//HttpFetchers
container.Bind<IHttpUserFetcher>().To<HttpUserFetcher>();
container.Bind<IHttpContinentFetcher>().To<HttpContinentFetcher>();
//TypeMappers
container.Bind<IUserManager>().To<UserManager>();
container.Bind<IMembershipInfoProvider>().To<MembershipAdapter>();
container.Bind<IUserMapper>().To<UserMapper>();
container.Bind<IContinentMapper>().To<ContinentMapper>();
.........
}
.......
}
NinjectWebCommon.cs 和 NinjectConfigurator.cs 都位于 App_Start 文件夹中。
container.Bind<ISession>().ToMethod(CreateSession); 是 NHibernate。它在NinjectConfigurator.cs 内private void ConfigureNHibernate(IKernel container) { ... } 内
【问题讨论】:
-
堆栈跟踪不足以找出您的问题,所以请发布您的
ContinentsController的代码! -
您已将
ContinentsController的代码复制了两次……但无论如何。问题是您的构造函数依赖项之一ISession session, IContinentMapper continentMapper, IHttpContinentFetcher continentFetcher, IDateTime dateTime未在 Ninject 中注册。确保所有内容都已注册或发布您的内核绑定以让我们了解缺少的内容。而且您的 UserController 工作正常,因为它有一组完全不同的依赖项。 -
@nemesv 我添加了你要求的内容。
-
您可以检查的另一件事:确保
HttpContinentFetcher和ContinentMapper的所有构造函数参数也已在contianer 中注册... -
@nemesv
HttpContinentFetcher具有ISession和ContinentMapper将接受子对象的映射器。ISession已经注册,如果我有一个大陆的孩子,即国家,它将被注册。
标签: c# asp.net-mvc-4 asp.net-web-api inversion-of-control ninject