2017-01-07 1 views
0

je code suivant dans mon projet WebAPIInjecter de nombreuses classes au contrôleur en utilisant ninject

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(); 
     } 

    } 

J'utilise les classes *Bll dans HomeApi méthodes
Cette conception est fondamentalement mauvais (en utilisant de nombreux *Bll classes dans le contrôleur) si elle est de m'aider à le corriger. Je sais aussi que mon contrôleur n'est pas découplé avec ces classes *Bll comment puis-je utiliser Ninject pour résoudre ce problème (avec cette approche ou avec la refonte) Je demande cela parce que je pense que mon code est erroné parce que je ne pouvais pas trouver un cas comme celui-ci dans un blog que j'ai lu sur ninject.

Note: Je suis nouveau avec l'aide Ninject

+0

Voir [refactorisation pour agréger les services] (http://blog.ploeh.dk/2010/02/02/RefactoringtoAggregateServices/) – NightOwl888

Répondre

2

Salut Fondamentalement, ce que vous voulez est DI si je comprends bien ... j'utiliser l'unité mais Ninject est le même .. essayer quelque chose comme:

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; 
     } 

    } 

Et puis vous Map vos interfaces avec les implémentations correctes (classes) dans un seul fichier (donc ce sera facile si vous avez besoin de changer quelque chose .. parce que vous aurez besoin de le changer en un seul fichier et pas partout vous avez utilisé l'interface à la place des classes concrètes):

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; 
      } 
     } 
    } 

Voici un exemple avec Ninject .. Je l'utilise dans une (application console) WebAPI de'autonome .. mais est similaire à un projet WebAPI ou le type Toher de projet