我曾尝试使用 Ninject 3 将“RuleChecker”注入我的控制器,但它不起作用。
错误“确保控制器具有无参数的公共构造函数。”
我已经阅读了大部分具有类似问题的主题,但找不到适合我的案例的解决方案。
应该很简单,但我不知道如何让它工作。 谢谢
public class CarController : ApiController
{
private readonly IRule rule;
public CarController(IRule rule)
{
this.rule = rule;
}
}
public class RuleChecker : IRule
{
private ICheckCar CarData { get; }
private IRuleSet RuleSet { get; }
private IFactory Factory { get; }
public RuleChecker(ICheckCar carData, IRuleSet ruleset,
IFactory factory)
{
CareData= cardata;
RuleSet = ruleSet;
Factory = factory;
}
}
几个我尝试过但不起作用的例子
private static void RegisterServices(IKernel kernel)
{
kernel. Bind<IRule>().To<RuleChecker>();
//OR
kernel.Bind<IRule>()
.ToConstructor(
ctorArg => new RuleChecker(
ctorArg.Inject<ICarData>(),
ctorArg.Inject<IRuleSet>(),
ctorArg.Inject<IFactory>()
)
);
}
注入:
private static IKernel CreateKernel()
{
var kernel = default(IKernel);
try
{
kernel = CommonDependencyRegistration.Setup();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
return kernel;
}
catch
{
kernel?.Dispose();
throw;
}
}
Global.asax
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
var config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
(new Newtonsoft.Json.Converters.StringEnumConverter());
}
}
您可以使用
ToMethod()
创建RuleChecker
的实例并注入依赖项。应该这样做。
Bind<IRule>().ToMethod(context =>
new RuleChecker(
context.Kernel.Get<ICheckCar>(),
context.Kernel.Get<IRuleSet>(),
context.Kernel.Get<IFactory>()
)
);
ASP.Net 需要默认的 ctor.
您需要通过 NInject(或任何其他 di 容器)解析控制器。只有这样你才能注入控制器。 s.https://stackoverflow.com/questions/14016727/how-to-use-ninject-with-asp-net-web-api