我的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
答案 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类型的项目