我正在使用Ninject在我的ASP.NET MVC应用程序中执行一些IoC。
我有一个界面" IService.cs" :
public interface IService
{
string method();
}
我有相应的实施" Service.cs" :
public class Service
{
string method()
{
return "result";
}
}
我已经在NinjectModule的另一个类中完成了绑定:
public class MyNinjectModule : NinjectModule
{
public override void Load()
{
RegisterServices();
}
private void RegisterServices()
{
Kernel.Bind<IService>().To<Service>();
}
}
我的A级使用此服务:
public class A
{
private readonly IService _service;
private int i;
public A(IService service, int i)
{
this._service=service;
this.i=i;
}
}
问题是,现在,我不知道如何在我的应用程序中实例化我的A类。这就是我陷入困境的地方,我怎么能打电话给Ninject 告诉我的应用程序去实现我的界面:
var myClass=new A(????)
答案 0 :(得分:1)
主要问题是您的Service
课程没有实施IService
。
public class Service
{
string method()
{
return "result";
}
}
应该是
public class Service : IService
{
public string method()
{
return "result";
}
}
但是对于实例化类,最好的方法是使用composition root来构建对象图。在MVC中,最好通过实现IControllerFactory
来处理。
public class NinjectControllerFactory : DefaultControllerFactory
{
private readonly IKernel kernel;
public NinjectControllerFactory(IKernel kernel)
{
this.kernel = kernel;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return controllerType == null
? null
: (IController)this.kernel.Get(controllerType);
}
}
using System;
using Ninject;
using DI;
using DI.Ninject;
using DI.Ninject.Modules;
internal class CompositionRoot
{
public static void Compose()
{
// Create the DI container
var container = new StandardKernel();
// Setup configuration of DI
container.Load(new MyNinjectModule());
// Register our ControllerFactory with MVC
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(container));
}
}
在Application_Start
中,添加:
CompositionRoot.Compose();
您还需要为班级A
创建一个界面并进行注册。无法自动解析整数,您必须明确地执行此操作。
Kernel.Bind<IClassA>().To<A>()
.WithConstructorArgument("i", 12345);
然后您将依赖项添加到控制器。依赖关系的依赖关系会自动解决。
public class HomeController : Controller
{
private readonly IClassA classA;
public HomeController(IClassA classA)
{
if (classA == null)
throw new ArgumentNullException("classA");
this.classA = classA;
}
public ActionResult Index()
{
// Use this.classA here...
// IService will be automatically injected to it.
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
}