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

本文关键字:引用 异常 试运行 依赖 关系 注入 | 更新日期: 2023-09-27 18:30:31

我正在学习ASP.Net MVC .我指的是亚当·弗里曼(Adam Freeman)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文件夹中有接口和实现类。

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

您应该删除控制器的默认构造函数,该构造函数永远不会注入任何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 容器,则显然应该使语法适应它,并在引导应用程序时注册正确的实例。