3

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

4

2 回答 2

1

我们在 global.asax 中使用类似于以下内容来注入依赖项。

DependencyResolver.Current.GetService<WebApiConfig>()
     .Register(GlobalConfiguration.Configuration);

编辑:忘了提到我们的WebApiConfig课程不是静态的。

于 2013-08-28T21:57:46.357 回答
0

几件事可以帮助你

1) 使用运行以下方法的 Ninject.Web.Common 包

[程序集:WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon),“开始”)] [程序集:WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(NinjectWebCommon),“停止”)]

如您所见, PreApplicationStartMethod在 AppStart 之前运行,当您添加“Ninject.Web.Common”时,将提供有关如何连接服务的指南。

2)我通常更喜欢实现一个名为INeedInitialization的接口,它有一个方法调用Initialize(IKernel ninjectKernel)

这样我可以在运行时动态定位所有实现,并传递 Ninject 的 StandardKernel 的实例,并以即插即用的方式执行 Binding。

3)加载所有模块后,将 NinjectWebCommon 中的 IKernal 实例公开为“ KernelInstance”

4)您可以在您的“ INeedInitialization”实现之一或任何您有绑定逻辑的地方使用以下内容将“ YourMessageHandler ”绑定到自身 kernel.Bind().ToSelf().InSingletonScope() 。所有依赖项都可以通过构造函数注入注入。

5) 像这样注册“YourMessageHandler”处理程序 config.MessageHandlers.Add(NinjectWebCommon.KernelInstance.Get< YourMessageHandler >());

6) 启动你的应用程序,让 NInject 发挥它的魔力

于 2016-02-11T23:27:04.503 回答