尝试运行依赖项注入时出现空引用异常

时间:2014-11-16 13:20:45

标签: c# asp.net-mvc dependency-injection nullreferenceexception loose-coupling

我正在学习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文件夹中有接口和实现类。

1 个答案:

答案 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容器,您显然应该调整语法并在引导应用程序时注册正确的实例。