Ninject.MVC3,Nuget,WebActivator哦,我的

Rob*_*Rob 14 asp.net-mvc ninject nuget webactivator asp.net-mvc-3

我想设置Ninject进行一个简单的测试,并使用Nuget演示易于设置.我想解决一个示例服务.

public interface ITestService
{
    string GetMessage();
}
public class TestService : ITestService 
{
    public string GetMessage() { return "hello world"; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

private static void RegisterServices(IKernel kernel)
{
   kernel.Bind<ITestService>().To<TestServiceOne>();
}
Run Code Online (Sandbox Code Playgroud)

现在我想"使用"Ninjet解析我的ITestService.

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

  ViewBag.Message = service.GetMessage();
  return View();
}
Run Code Online (Sandbox Code Playgroud)

设置Ninject还有另一部分吗?我需要提供一个解析器吗?

解决我的ITestService需要什么代码.

谢谢你的帮助»

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

感谢关于'控制器构造器'注入的响应.只需添加一个带有ITestServcice的构造函数作为参数.... BAMM !!!

private ITestService _service;

public HomeController(ITestService service)
{
  _service = service
}
public ActionResult Index()
{
  ViewBag.Message = _service.GetMessage();
  return View();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我认为你是Ninject获得它的方式,但不确定.

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

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

更正:NinjectMVC3类创建内核,并保持对'Bootstrapper'的引用,引导程序作为其上的IKernel.

所以我在App_Start/NinjectMVC3类中添加了'resolve'方法......效果很好.

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>();
   }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 16

脚步:

  1. 创建一个新的ASP.NET MVC 3项目
  2. 从Package Console安装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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ITestService>().To<TestService>();
    }       
    
    Run Code Online (Sandbox Code Playgroud)


Jud*_*ngo 4

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

私有 ITestService 服务;

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

公共 ActionResult Index()
{
  ViewBag.Message = this.service.GetMessage();
  返回视图();
}

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


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

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

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

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