0

我正试图围绕Onion Architecture中的依赖注入,我发现这个解决方案在洋葱周围使用依赖解析层。但是发生的事情太多了,我完全迷失了。

所以我设置了一个项目来尝试一下。我喜欢从简单开始,因此(MVC)控制器方法上的简单日志条目将是一个好的开始。我想使用动态模块加载( kernel.Load("*.dll");),因为它是 Ninject wiki 推荐的。

我的解决方案如下所示:(目前)

Solution
- Core.Services
- Infrastructure.Logging
- DependencyResolution
- UI.MVC (default internet template)

我想遵循此处概述的依赖关系解决指南。

在此处输入图像描述

记录器

namespace Core.Services
{
    public interface ILogger
    {
        void Log(string message);
    }
}

日志实现

namespace Infrastructure.Logging
{
    public class DebugLogger : ILogger
    {
        public void Log(string message)
        {
            Debug.WriteLine(message);
        }
    }
}

依赖解析

namespace DependencyResolution
{
    public class TestModule : NinjectModule
    {
        public override void Load()
        {
            Bind<ILogger>().To<DebugLogger>();
        }
    }
}

我想要完成的

用户界面

namespace UI.MVC.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger _logger;

        public HomeController(ILogger logger)
        {
            _logger = logger;
        }

        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

            _logger.Log("It works!");

            return View();
        }
    }
}

我需要以kernel.Load("*.dll");某种方式运行,我需要设置我的 MVC 以使用 DI。我现在才确定如何,因为 UI 无法知道 Dependency Resolution 层。

4

1 回答 1

1

您的 DI 容器应该在某处组成。这个地方叫做composition root最外层。在您的情况下,这将是 ASP.NET MVC 应用程序。所以说它不应该知道 DI 根本没有意义。Ninject.MVC3 包附带了一个自定义依赖解析器实现,它被插入到应用程序中,您将在控制器中获得自动 DI。

于 2013-03-03T17:14:57.963 回答