我正在学习ASP.Net MVC
。我指的是亚当弗里曼的Pro Asp.Net MVC 4
书。我在依赖注入中遇到了一个主题名称Building Loosely Couple App
我实际上并没有得到它的实际内容,所以我试着用简短的方式写下他的例子。
我创建了一个接口IReservation
,如下所示
public interface IReservation
{
string getName();
}
和一个实现它的类
public class Reservation:IReservation
{
public string getName()
{
return "Wooww... It worked :D ";
}
}
然后我将接口的对象传递给我的控制器构造函数,就像书中一样。我有控制器代码如下
public class HomeController : Controller
{
IReservation res;
public HomeController(IReservation reservation)
{
res = reservation;
}
public HomeController() { }
public ActionResult Index()
{
string me = res.getName();
return View();
}
}
调试时,我在NullReferenceException
上获得了string me = res.getName();
。我相信它是因为我没有使用new
关键字创建它的实例,但我不确定。我在这里,如果是,那么这个例子如何纠正?我在Models
文件夹中有接口和实现类。
答案 0 :(得分:4)
您应该删除控制器的默认构造函数,它永远不会注入任何IReservation
实例:
public HomeController() { }
现在您的控制器定义变为:
public class HomeController : Controller
{
private readonly IReservation reservation;
public HomeController(IReservation reservation)
{
this.reservation = reservation;
}
public ActionResult Index()
{
string me = this.reservation.getName();
return View();
}
}
现在剩下的就是引导和配置您喜欢的DI框架,以便在控制器中注入正确的IReservation
实例。
例如,如果您在引导程序中使用Ninject.MVC
:
kernel.Bind<IReservation>.To<Reservation>();
如果您正在使用其他DI容器,您显然应该调整语法并在引导应用程序时注册正确的实例。