【问题标题】:Ninject not resolving dependencies for a ControllerNinject 不解决控制器的依赖关系
【发布时间】:2015-03-29 06:28:46
【问题描述】:

我不知道这是怎么回事。这对我来说毫无意义。

我有一个抛出以下错误的控制器:

System.InvalidOperationException:尝试创建“LandingController”类型的控制器时发生错误。确保控制器有一个无参数的公共构造函数。 ---> Ninject.ActivationException:使用从 IApiService 到 ApiService 的绑定激活 IApiService 时出错 没有构造函数可用于创建实现类型的实例。激活路径:2)LandingController类型构造函数的参数apiService中注入依赖IApiService 1)LandingController请求建议:1)确保实现类型有公共构造函数。 2) 如果您已经实现了单例模式,请改用带有 InSingletonScope() 的绑定。

无论我做什么,都无济于事。 如果我有:

  • 控制器中没有构造函数
  • 一个带有服务的构造函数
  • 两个带有服务和无参数的构造函数

如果我希望无参数构造函数工作,那么它不会解析 IApiService。

我在 NinjectWebCommon 中有以下设置:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IApiService>().To<ApiService>();
    kernel.Bind<IMembersClient>().To<MembersClient>();
}  

控制器是:

public class LandingController : Controller
{

    IApiService _apiService;

    LandingController(IApiService apiService)
    {
        _apiService = apiService;
    }

    // GET: Landing

    public ActionResult Index()
    {
        var avm = new ApplicationViewModel();


        _apiService.GetAcc();


        return View(avm);
    }
}

API 服务是:

public class ApiService : IApiService
{
    private readonly IMembersClient _membersClient;

    ApiService(IMembersClient membersClient)
    {
        _membersClient = membersClient;
    }

    public void GetAcc()
    {
        _membersClient.Test();
    }
}

会员客户是:

public class MembersClient : IMembersClient 
{
    public MembersClient()
    {
      public void Test()
      {

      }
    }
}

这是我找到的最好的帖子:

Ninject Dependency Injection with Asp.Net MVC3 or MVC4

但它从来没有帮助解决问题。

编辑:完整的 NinjectWebCommon

public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    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);
            return kernel;
        }
        catch
        {
            kernel.Dispose();
            throw;
        }
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IApiService>().To<ApiService>();
        kernel.Bind<IMembersClient>().To<MembersClient>();
    }

编辑:尝试属性注入

属性注入代码:

[Inject]
public IApiService ApiServiceC { private get; set; }

更新错误:

System.InvalidOperationException:尝试创建“LandingController”类型的控制器时发生错误。确保控制器有一个无参数的公共构造函数。 ---> Ninject.ActivationException:使用从 IApiService 到 ApiService 的绑定激活 IApiService 时出错 没有构造函数可用于创建实现类型的实例。激活路径: 2) 将依赖 IApiService 注入到 LandingController 类型的属性 ApiServiceC 1) 请求 LandingController 建议: 1) 确保实现类型具有公共构造函数。 2) 如果您已经实现了单例模式,请改用带有 InSingletonScope() 的绑定。

【问题讨论】:

  • 可以发一下resolver的注册码吗?
  • 我添加了我所拥有的。
  • 你会调用这段代码吗?
  • Ensure that the implementation type has a public constructor 有没有试过在构造函数定义前添加public
  • 请调试您的代码并确保 (1) 您的方法 RegisterServices() 被调用并且 (2) LandingController 的创建是通过提供给RegisterServices() 方法。你能确认(真的确认)是这样吗?

标签: c# dependency-injection asp.net-mvc-5 ninject


【解决方案1】:

嗯....经过多次测试和尝试不同的东西。

解决方案是彻底删除 IApiService 和 ApiService 并重新创建它们。

这成功地让一切再次正确连接起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2015-10-16
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多