Ninject.MVC3,Nuget,WebActivator哦,我的

时间:2011-03-15 16:48:10

标签: asp.net-mvc asp.net-mvc-3 ninject nuget webactivator

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

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

我运行NuGet安装包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类创建内核,并且保持对'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>();
   }
}

2 个答案:

答案 0 :(得分: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>();
    }       
    

答案 1 :(得分:4)

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

private ITestService service;

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

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

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


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

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

查看Ninject dependency inject for controllers in MVC3