【发布时间】: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