我可以在Asp.net Web Api项目的WebApiConfig类中使用Ninject注入类的实例吗? 这是我的尝试
public static class WebApiConfig
{
private static IAccountsService _accountsService;
[Inject]
public static IAccountsService AccountsService
{
get { return _accountsService; }
set { _accountsService = value; }
}
public static void Register(HttpConfiguration config)
{
var authentication = CreateAuthenticationConfiguration();
config.MessageHandlers.Add(new AuthenticationHandler(authentication));
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnableSystemDiagnosticsTracing();
}
private static AuthenticationConfiguration CreateAuthenticationConfiguration()
{
var authentication = new AuthenticationConfiguration
{
RequireSsl = false,
EnableSessionToken = true
};
// Basic Authentication
authentication.AddBasicAuthentication(AccountsService.ValidateAccountUsingSiteCredential);
return authentication;
}
}
但是,我在此行Object reference not set to an instance of an object
authentication.AddBasicAuthentication(AccountsService.Validate);
答案 0 :(得分:1)
我们在global.asax中使用类似于以下的内容来注入依赖项。
DependencyResolver.Current.GetService<WebApiConfig>()
.Register(GlobalConfiguration.Configuration);
编辑:忘记提及我们的WebApiConfig
课程不是静态的。
答案 1 :(得分:0)
可以帮助你的一些事情
1)使用运行以下方法的Ninject.Web.Common包
[assembly:WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon),&#34; Start&#34;)] [assembly:WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(NinjectWebCommon),&#34; Stop&#34;)]
正如您所见, PreApplicationStartMethod 在AppStart之前运行,当您添加&#34; Ninject.Web.Common&#34;时,会有一个指导您如何连接服务。
2)我通常更喜欢实现名为 INeedInitialization 的接口,该接口有一个方法调用 Initialize(IKernel ninjectKernel)
这样我就可以在运行时动态定位所有实现并传递Ninject的StandardKernel实例,并以即插即用的方式执行Binding。
3)将来自NinjectWebCommon的IKernal实例公开为&#34; KernelInstance&#34; 加载所有模块后
4)您可以使用以下内容来绑定&#34; YourMessageHandler &#34;对自己 kernel.Bind()。ToSelf()。InSingletonScope()在你的&#34; INeedInitialization&#34; 的一个实现中,或者你有绑定逻辑的地方。 可以通过构造函数注入来注入所有依赖项。
5)注册&#34; YourMessageHandler&#34; 处理程序,如此config.MessageHandlers.Add(NinjectWebCommon.KernelInstance.Get&lt; YourMessageHandler &gt;());
6)启动你的应用程序,让NInject发挥其魔力