【问题标题】:Configure Ninject for 3 layers architecture in MVC 4在 MVC 4 中为 3 层架构配置 Ninject
【发布时间】:2013-07-28 09:09:12
【问题描述】:

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

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

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

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

}

感谢您的帮助。

【问题讨论】:

    标签: c# asp.net-mvc-4 architecture ninject


    【解决方案1】:

    不确定是否理解您的问题,但我认为您不必在业务层中配置 Ninject。您的应用程序中应该只有一个 DI 配置,并且应该在 Application_start() 上。

    您的业务层肯定会包含业务对象和业务服务,它们将使用存储库合约。这些服务会。在这种情况下,您还将在 Application_Start() 中配置服务绑定(将 IHotelService 绑定到 HotelService)。

    我看到的设计是您的控制器现在将使用服务(您将在控制器构造函数中注入 IHotelService)

    希望对你有帮助! 朱利安

    【讨论】:

    • 我补充说,您可以使用 Ninject 定义模块,继承自 NinjectModule,这将帮助您对绑定配置进行排序
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2019-10-22
      • 2015-04-02
      • 2015-06-24
      • 1970-01-01
      • 2011-07-30
      • 2019-03-07
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多