gpt4 book ai didi

c# - MVC 4 Web Api Controller 没有默认构造函数?

转载 作者:IT王子 更新时间:2023-10-29 04:53:19 24 4
gpt4 key购买 nike

这是痕迹:

<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 { ... }工作正常。我比较了两个 Controller ,所有设置和结构都相似。

我正在使用 Ninject我的系统设置类似于 Jamie Kurtz Asp.Net Mvc 4 and the Web Api: Building a REST Service from Start to Finish .

从堆栈跟踪中,是否有人能够发现问题以及如何解决?谢谢!

根据要求。

大陆 Controller

[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.csNinjectConfigurator.cs位于 App_Start文件夹。

container.Bind<ISession>().ToMethod(CreateSession);NHibernate .在NinjectConfigurator.cs内里面private void ConfigureNHibernate(IKernel container) { ... }

最佳答案

您需要告诉 Ninject 如何正确解析 Web API 依赖项。

您可以使用 Felipe Oriani 的答案,但如果您愿意,可以使用名为 WebApiContrib.IoC.Ninject 的 NuGet 包来为您完成此操作。

  1. 在 Visual Studio 中转到:工具 > NuGet 包管理器 > 管理解决方案的 NuGet 包

  2. 安装WebApiContrib.IoC.Ninject

  3. 编辑:NinjectWebCommon.cs 并更新 CreateKernel() 方法以包括:GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);

    private static IKernel CreateKernel()
    {
    var kernel = new StandardKernel();

    try
    {
    kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
    kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

    RegisterServices(kernel);

    //Note: Add the line below:
    GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);

    return kernel;
    }
    catch
    {
    kernel.Dispose();
    throw;
    }
    }

关于c# - MVC 4 Web Api Controller 没有默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17462175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com