14

我想设置 Ninject 来做一个简单的测试,以及使用 Nuget 演示易于设置。我想解决一个示例服务。

public interface ITestService
{
    string GetMessage();
}
public class TestService : ITestService 
{
    public string GetMessage() { return "hello world"; }
}

我运行 NuGet Install-Package NinjectMVC3 .... 它很好地将 NinjectMVC3.cs 放入我的 App_Start 文件夹中,并装饰有一些 WebActivator 属性以使其全部加载。

接下来我在 NinjectMVC3.RegisterServices 方法中添加我的绑定:

private static void RegisterServices(IKernel kernel)
{
   kernel.Bind<ITestService>().To<TestServiceOne>();
}

现在我想“使用”Ninjet 来解决我的 ITestService。

public ActionResult Index()
{
  //[Ninject, give me the service I need]
  ITestService service = ??? 

  ViewBag.Message = service.GetMessage();
  return View();
}

设置 Ninject 还有其他部分吗?我需要提供解析器吗?

我需要什么代码来解决我的 ITestService。

感谢帮助 »

** * * * * * * * * * * * 更新: * * * * * * * * * * * * * * * * **

感谢您对“控制器构造函数”注入的大力响应。只需添加一个带有 ITestServcice 作为参数的构造函数 .... BAMM !!!

private ITestService _service;

public HomeController(ITestService service)
{
  _service = service
}
public ActionResult Index()
{
  ViewBag.Message = _service.GetMessage();
  return View();
}

现在,当我需要直接获取内核时,理想的解决方案是什么。

var kernel = ... // Go grab the kernel from ????? (thanks Judah).
ITestService service = kernel.Get<ITestService>();

我可以看到 NinjectMVC3 类创建了内核,但没有保存或公开对它的引用,也找不到明显的类/方法来“获取内核”。

我认为你是一种获得它的 Ninject 方法,但不确定。

** * * * * * * * * * * *(最终)更新:* * * * * * * * * * * * * * * **

再次感谢您的回答和评论......

更正:NinjectMVC3 类创建内核,并持有对“引导程序”的引用,它作为一个 IKernel。

所以我在 App_Start/NinjectMVC3 类中添加了一个“解决”方法......效果很好。

public static class NinjectMVC3 /// created by the NinjectMVC3 NuGet  Packagae
{
   // add method to provide a global resolver.   
   public static T Resolve<T>()
   {
       return bootstrapper.Kernel.Get<T>();
   }
}
4

2 回答 2

16

脚步:

  1. 创建一个新的 ASP.NET MVC 3 项目
  2. 从包控制台安装 NuGet 包:Install-Package Ninject.MVC3
  3. 在 HomeController 中:

    public class HomeController : Controller
    {
        private readonly ITestService _service;
        public HomeController(ITestService service)
        {
            _service = service;
        }
    
        public ActionResult Index()
        {
            ViewBag.Message = _service.GetMessage();
            return View();
        }
    }
    
  4. App_Start/NinjectMVC3.cs

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ITestService>().To<TestService>();
    }       
    
于 2011-03-15T17:02:17.390 回答
4

将 ITestService 作为构造函数参数添加到您的控制器:

私有 ITestService 服务;

公共 MyController(ITestService 服务)
{
   this.service = 服务;
}

公共行动结果索引()
{
  ViewBag.Message = this.service.GetMessage();
  返回视图();
}

Ninject 会自动将 ITestService 注入到您的控制器中。然后使用 Index 方法中的 service 字段。


或者,如果您不希望 Ninject 注入到您的控制器构造函数中,您可以保留您创建的内核,然后在您的 Index 方法中,您调用 kernel.Get<ITestService>() 来获取一个实例:

公共行动结果索引()
{
  var kernel = ... // 获取我们在应用启动时创建的内核。
  ITestService 服务 = kernel.Get<ITestService>();

  ViewBag.Message = service.GetMessage();
  返回视图();
}

看看MVC3 中控制器的 Ninject 依赖注入

于 2011-03-15T16:59:57.817 回答