WebApiConfig类中的依赖注入

时间:2013-08-28 21:41:03

标签: asp.net-web-api ninject

我可以在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);

2 个答案:

答案 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发挥其魔力