我想设置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添加为param .... 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类创建内核,但不会持有或展示对它的参考,也无法找到“获取内核”的明显类/方法。

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

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

再次感谢您的答案和评论。

校正:NinjectMVC3类创建内核,并确实对“ Bootstrapper”的引用,它是IKERNEL上的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>();
   }
}
有帮助吗?

解决方案

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

private ITestService service;

public MyController(ITestService service)
{
   this.service = service;
}

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

Ninject会自动将iTestService注入您的控制器。然后使用索引方法中的服务字段。


或者,如果您不希望nInject注入控制器构造函数,则可以在创建的内核周围,然后在索引方法中,呼叫kernel.get。u003CITestService> ()获取一个实例:

public ActionResult Index()
{
  var kernel = ... // Go grab the kernel we created back in app startup.
  ITestService service = kernel.Get<ITestService>();

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

看一下 MVC3中控制器的Ninject依赖性注入.

其他提示

脚步:

  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>();
    }       
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top