IoC 控制器实际上是如何工作的?特别是在 .NET MVC 中?
How do IoC controllers actually work? Specifically in .NET MVC?
控制器构造函数:
IRestaurantData db;
public HomeController(IRestaurantData db)
{
this.db = db;
}
//容器代码
public class ContainerConfig
{
internal static void RegisterContainer(HttpConfiguration httpConfiguration)
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterApiControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<InMemoryRestaurantData>()
.As<IRestaurantData>()
.SingleInstance();
var container = builder.Build();
// MVC CONTROLLER VERSION
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
// WEBAPI CONTROLLER VERSION
httpConfiguration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
因此,我正在努力了解反转控制容器的工作原理。我所在的课程是使用 Autofac 创建这些容器。根据我目前的理解,创建这个容器就是这样,当我用 IRestaurantData 实例化我的 HomeController 时,容器在每次使用时都指向接口 AT InMemoryResataurantData。我能理解这么多。我也感到困惑的是我不明白我的控制器实际上在程序中的什么地方被实例化了?有人知道吗?
这是由 autofac 完成的。每当您从容器请求 class 时,它都会使用默认构造函数为您实例化该类型。如果你有一个带参数的构造函数,它将在容器中查找其他已注册类型,并将实例化一个新对象或获取一个已使用的对象。
您的实例化类型可以是瞬态的(短暂的)也可以不是。
简而言之;当请求对象时。
控制器构造函数:
IRestaurantData db;
public HomeController(IRestaurantData db)
{
this.db = db;
}
//容器代码
public class ContainerConfig
{
internal static void RegisterContainer(HttpConfiguration httpConfiguration)
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterApiControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<InMemoryRestaurantData>()
.As<IRestaurantData>()
.SingleInstance();
var container = builder.Build();
// MVC CONTROLLER VERSION
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
// WEBAPI CONTROLLER VERSION
httpConfiguration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
因此,我正在努力了解反转控制容器的工作原理。我所在的课程是使用 Autofac 创建这些容器。根据我目前的理解,创建这个容器就是这样,当我用 IRestaurantData 实例化我的 HomeController 时,容器在每次使用时都指向接口 AT InMemoryResataurantData。我能理解这么多。我也感到困惑的是我不明白我的控制器实际上在程序中的什么地方被实例化了?有人知道吗?
这是由 autofac 完成的。每当您从容器请求 class 时,它都会使用默认构造函数为您实例化该类型。如果你有一个带参数的构造函数,它将在容器中查找其他已注册类型,并将实例化一个新对象或获取一个已使用的对象。
您的实例化类型可以是瞬态的(短暂的)也可以不是。
简而言之;当请求对象时。