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
脚步:
Install-Package Ninject.MVC3
在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)在App_Start/NinjectMVC3.cs
:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ITestService>().To<TestService>();
}
Run Code Online (Sandbox Code Playgroud)将 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(); 返回视图(); }
归档时间: |
|
查看次数: |
6777 次 |
最近记录: |