在 MVC 4 中为 3 层架构配置 Ninject [英] Configure Ninject for 3 layers architecture in MVC 4

查看:30
本文介绍了在 MVC 4 中为 3 层架构配置 Ninject的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前,我正在构建一个 2 层的网站.

Currently, I'm building a website with 2 layers.

  • Web UI:这是一个 MVC 4 项目,用于与用户交互
  • 数据访问:这是一个 C# 库.该层负责与数据库交互.

我正在使用 Ninject 进行依赖注入.到目前为止,一切正常.但是现在,我想在 Web UI 和数据访问之间插入一个新层,称为业务逻辑.所以架构将是:

I'm using Ninject for Dependency Injection. Up to now, it's OK. But now, I want to insert a new layer between Web UI and Data Access, called Business Logic. So the architecture would be:

  • Web UI:使用来自业务逻辑的接口.
  • 业务逻辑:使用数据访问接口.
  • 数据访问:保持不变.

我的问题是,我应该如何在 Web UI 和业务逻辑中配置我的 Ninject 以实现我想要的?这是我此时的源代码:

数据访问层:

接口 IHotelRepository.cs

public interface IHotelRepository
{
    IQueryable<Hotel> Hotels { get; }
}

具体类 HotelRepository.cs

public class HotelRepository : IHotelRepository
{
    private HotelDbEntities context = new HotelDbEntities();

    public IQueryable<Hotel> Hotels { get { return context.Hotels; } }
}

Web UI 层:

NinjectControllerFactory.cs

public class NinjectControllerFactory : DefaultControllerFactory
{
    private IKernel ninjectKernel;

    public NinjectControllerFactory()
    {
        ninjectKernel = new StandardKernel();
        AddBindings();
    }

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        return controllerType == null ? null : (IController) ninjectKernel.Get(controllerType);
    }

    private void AddBindings()
    {
        ninjectKernel.Bind<IHotelRepository>().To<HotelRepository>();
    }
}

Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
    }
}

HotelController.cs

public class HotelController : Controller
{
    private IHotelRepository hotelRepository;

    public HotelController(IHotelRepository repository)
    {
        hotelRepository = repository;
    }

    public ActionResult List()
    {
        return View(hotelRepository.Hotels);
    }

}

感谢您的帮助.

推荐答案

只需将业务逻辑中其他所需组件的绑定添加到 NinjectControllerFactory 中的 AddBindings 方法即可.Ninject 能够解决链式依赖项,如控制器 -> 服务 -> 存储库.

Just add bindings for additional required components from bussiness logic to your AddBindings method in NinjectControllerFactory. Ninject is able to resolve chained dependencies like controller -> service -> repository.

这篇关于在 MVC 4 中为 3 层架构配置 Ninject的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆