ASP.NET MVC如何知道要调用的控制器构造函数?

g_b

我目前正在启动ASP.NET MVC 4,在我正在阅读的书中,作者介绍了Ninject进行依赖项注入。他创建了一个自定义的依赖项解析器(我不完全了解它的工作原理,但我认为它的用途是轻松管理依赖项解析)。

这是控制器代码:

public class HomeController : Controller
{
    private Product[] products = {
        new Product {Name = "Kayak", Category = "Watersports", Price = 275M},
        new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M},
        new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M},
        new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M}
    };

    private IValueCalculator calc;
    public HomeController(IValueCalculator calcParam)
    {
        calc = calcParam;
    }

    public ActionResult Index()
    {
        ShoppingCart cart = new ShoppingCart(calc) { Products = products };
        decimal totalValue = cart.CalculateProductTotal();
        return View(totalValue);
    }
}

和自定义依赖项解析器:

public class NinjectDependencyResolver : IDependencyResolver
{
    private IKernel kernel;
    public NinjectDependencyResolver()
    {
        kernel = new StandardKernel();
        AddBindings();
    }

    public object GetService(Type serviceType)
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.GetAll(serviceType);
    }

    private void AddBindings()
    {
        kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
    }
}

在Application_Start()中,设置了解析器:

DependencyResolver.SetResolver(new NinjectDependencyResolver());

问题:

  1. ASP.NET MVC如何知道要调用哪个控制器构造函数?我以为它将要调用默认构造函数,但没有一个,我尝试添加一个,但仍调用了带有参数的构造函数。

  2. ASP.NET MVC如何将IValueCalculator传递给构造函数?

卢克

这是来自文档的引用(https://github.com/ninject/ninject/wiki/Dependency-Injection-With-Ninject):

当要求实例化一个对象时,Ninject将查看该类型可用的公共构造函数,并选择具有其知道如何解析的参数最多的一个-如果没有合适的参数,则选择无参数的一个(有一个可以使用的属性)要覆盖它,请参阅构造函数注入以了解更多细节)。

以及来自这里的另一个报价(https://github.com/ninject/ninject/wiki/Injection-Patterns):

如果构造函数具有[Inject]属性,则将使用它(但是,如果
将该属性应用于多个属性,则Ninject
在检测到运行时会抛出NotSupportedException)。

如果没有构造函数具有[Inject]属性,则Ninject将选择Ninject
能够解析的参数最多的一个

如果未定义构造函数,则Ninject将选择默认的无参数构造函数(假设有一个)。

以及ASP.NET MVC如何将IValueCalculator传递给构造函数?

整个MVC管道使用控制器工厂来构建特定控制器的实例。控制器工厂在内部使用DependencyResolver。这就是为什么在应用程序启动时注册依赖解析器的原因:

DependencyResolver.SetResolver(new NinjectDependencyResolver());

正如我之前写的,Ninject知道如何找到正确的构造函数并使用它来构建实例。它找到以下构造函数:

public HomeController(IValueCalculator calcParam)

依赖解析器用于查找的实现IValueCalculator,该实现在此处定义:

private void AddBindings()
{
    kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
}

Ninject在这里再次尝试为class查找构造函数LinqValueCalculator如果构造函数具有依赖项,则将使用相同的机制注入它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ASP.NET MVC如何知道要调用的控制器构造函数?

来自分类Dev

当不从Controller类继承控制器时,asp.net mvc 6如何知道要添加哪些资源?

来自分类Dev

如何使用 ASP.net MVC 在同一控制器内调用函数任务?

来自分类Dev

每个请求都调用ASP.NET Web API控制器构造函数

来自分类Dev

带有Unity的ASP.NET MVC中的基本控制器构造函数注入

来自分类Dev

带有构造函数注入的单元测试ASP.NET MVC控制器

来自分类Dev

从ASP.NET MVC控制器构造函数访问时,IPrincipal属性为null

来自分类Dev

ASP.Net MVC 控制器初始化其构造函数的时间太长

来自分类Dev

角ASP.NET MVC调用C#控制器函数

来自分类Dev

从Javascript调用ASP.NET MVC 4控制器

来自分类Dev

从 JavaScript 正确调用控制器 - ASP.NET MVC

来自分类Dev

ASP.NET MVC 调用控制器方法 DevExpress

来自分类Dev

使用相同的参数和方法名称,控制器如何在 ASP.NET 核心 MVC 中找到要调用的那个

来自分类Dev

ASP.Net MVC控制器构造函数显示错误System.Web.Mvc.Controller.Session.get返回null

来自分类Dev

如何查看ASP.Net MVC中调用的每个控制器和操作方法?

来自分类Dev

如何通过按钮单击asp.net MVC 4中的调用控制器

来自分类Dev

如何在ASP.NET MVC中使用routeValue参数调用控制器操作

来自分类Dev

如何在ASP.NET MVC中的控制器中调用模型方法

来自分类Dev

如何调用从ASP.Net MVC4控制器方法返回Task <T>的方法?

来自分类Dev

如何查看ASP.Net MVC中调用的每个控制器和操作方法?

来自分类Dev

如何使ASP.NET MVC控制器的GET方法仅从链接中调用?

来自分类Dev

如何从控制器代码 asp.net mvc Core 调用 web url

来自分类Dev

控制器动作如何调用Asp .Net Core?

来自分类Dev

如何将列表从控制器传递到ASP.NET MVC中的javascript函数?

来自分类Dev

如何使ASP.NET MVC控制器方法异步

来自分类Dev

在ASP.NET MVC 5中使用ControllerFactory在控制器的构造函数中进行依赖项注入

来自分类Dev

嵌套列表表单 ASP.NET MVC -- 不知道如何编写控制器代码

来自分类Dev

如何在 ASP.NET Core Identity 中控制器的构造函数中获取登录用户名

来自分类Dev

对ASP.NET MVC控制器的Ajax POST调用,给出net :: ERR_CONNECTION_RESET

Related 相关文章

  1. 1

    ASP.NET MVC如何知道要调用的控制器构造函数?

  2. 2

    当不从Controller类继承控制器时,asp.net mvc 6如何知道要添加哪些资源?

  3. 3

    如何使用 ASP.net MVC 在同一控制器内调用函数任务?

  4. 4

    每个请求都调用ASP.NET Web API控制器构造函数

  5. 5

    带有Unity的ASP.NET MVC中的基本控制器构造函数注入

  6. 6

    带有构造函数注入的单元测试ASP.NET MVC控制器

  7. 7

    从ASP.NET MVC控制器构造函数访问时,IPrincipal属性为null

  8. 8

    ASP.Net MVC 控制器初始化其构造函数的时间太长

  9. 9

    角ASP.NET MVC调用C#控制器函数

  10. 10

    从Javascript调用ASP.NET MVC 4控制器

  11. 11

    从 JavaScript 正确调用控制器 - ASP.NET MVC

  12. 12

    ASP.NET MVC 调用控制器方法 DevExpress

  13. 13

    使用相同的参数和方法名称,控制器如何在 ASP.NET 核心 MVC 中找到要调用的那个

  14. 14

    ASP.Net MVC控制器构造函数显示错误System.Web.Mvc.Controller.Session.get返回null

  15. 15

    如何查看ASP.Net MVC中调用的每个控制器和操作方法?

  16. 16

    如何通过按钮单击asp.net MVC 4中的调用控制器

  17. 17

    如何在ASP.NET MVC中使用routeValue参数调用控制器操作

  18. 18

    如何在ASP.NET MVC中的控制器中调用模型方法

  19. 19

    如何调用从ASP.Net MVC4控制器方法返回Task <T>的方法?

  20. 20

    如何查看ASP.Net MVC中调用的每个控制器和操作方法?

  21. 21

    如何使ASP.NET MVC控制器的GET方法仅从链接中调用?

  22. 22

    如何从控制器代码 asp.net mvc Core 调用 web url

  23. 23

    控制器动作如何调用Asp .Net Core?

  24. 24

    如何将列表从控制器传递到ASP.NET MVC中的javascript函数?

  25. 25

    如何使ASP.NET MVC控制器方法异步

  26. 26

    在ASP.NET MVC 5中使用ControllerFactory在控制器的构造函数中进行依赖项注入

  27. 27

    嵌套列表表单 ASP.NET MVC -- 不知道如何编写控制器代码

  28. 28

    如何在 ASP.NET Core Identity 中控制器的构造函数中获取登录用户名

  29. 29

    对ASP.NET MVC控制器的Ajax POST调用,给出net :: ERR_CONNECTION_RESET

热门标签

归档