使用ninject将许多类注入控制器

时间:2017-01-07 15:26:52

标签: c# asp.net-web-api ninject inversion-of-control

我的WebApi项目中有以下代码

public class HomeApiController : ApiController
    {
        private WebSettingBll _webSettingBll;
        private PageBll _pageBll;
        private HomeBll _homeBll;
        private readonly HitCountBll _hitCountBll;
        public HomeApiController()
        {
            _hitCountBll = new HitCountBll();
            _webSettingBll = new WebSettingBll();
            _homeBll = new HomeBll();
            _pageBll = new PageBll();
        }

    }

我在*Bll方法中使用HomeApi类 这个设计基本上是错误的(在控制器中使用了很多*Bll类),如果它帮助我纠正它。

我也知道我的控制器没有与那些*Bll类分离,我如何使用Ninject来解决这个问题(使用这种方法或重新设计)我问这个因为我认为我的代码是错了,因为我在任何关于ninject的博客中都找不到这样的情况。

注意:我是使用Ninject

的新手

1 个答案:

答案 0 :(得分:2)

嗨基本上你想要的是DI,如果我理解正确的话......我使用Unity但是Ninject是一样的...尝试使用类似的东西:

public class HomeApiController : ApiController
    {
        private IWebSettingBll _webSettingBll;
        private IPageBll _pageBll;
        private IHomeBll _homeBll;
        private readonly IHitCountBll _hitCountBll;
        public HomeApiController(IWebSettingBll webSettingBll,IHitCountBll hitCountBll,IPageBll pageBll,IHomeBll homeBll)
        {
            _hitCountBll = hitCountBll;
            _webSettingBll = webSettingBll;
            _homeBll = homeBll;
            _pageBll = pageBll;
        }

    }

然后你只需要在一个文件中Map你的接口与正确的实现(类)(如果你需要改变某些东西,那么它很容易......因为你需要只在一个文件中更改它,而不是在任何地方使用接口而不是具体的类):

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http.Formatting;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Http;       
    using Newtonsoft.Json;
    using Newtonsoft.Json.Serialization;
    using Ninject;
    using Ninject.Web.Common.OwinHost;
    using Ninject.Web.WebApi.OwinHost;
    using Owin;


    namespace SelfHostSIAE
    {
        public class Startup
        {
            // This code configures Web API. The Startup class is specified as a type
            // parameter in the WebApp.Start method.
            public void Configuration(IAppBuilder appBuilder)
            {
                // Configure Web API for self-host. 
                HttpConfiguration config = new HttpConfiguration();


                config.MapHttpAttributeRoutes();
                config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );

                var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
                jsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                // jsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
                jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

                appBuilder.UseErrorPage();
                appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
                appBuilder.UseNinjectMiddleware(CreateKernel);
                appBuilder.UseNinjectWebApi(config);
                //appBuilder.UseWebApi(config);
            }

            public static IKernel CreateKernel()
            {
                var kernel = new StandardKernel();

                kernel.Bind<IWebSettingBll>().To<WebSettingBll>().InSingletonScope(); //<-- IF YOU WANT  A SINGLETON
                kernel.Bind<IPageBll>().To<PageBll>();
                kernel.Bind<ILogger>().To<Logger>();
                kernel.Bind<IHomeBll>().To<HomeBll>();
                kernel.Bind<IHitCountBll>().To<HitCountBll>();
                return kernel;
            }
        }
    }

这是Ninject的一个例子..我在自托管webapi(控制台应用程序)中使用它..但类似于webapi项目或toher类型的项目