ASP.NET Core Controller与IOC结合问题整理(5)

只需要通过上面简单得两步,既可以将Controller托管到Autofac容器中。但是,我们说过了Autofac还支持属性注入,但是默认的方式只支持构造注入的方式,那么怎么让Controller支持属性注入呢?我们还得从最根本的出发,那就是解决Controller实例存和取的问题

首先为了让Controller托管到Autofac中并且支持属性注入,那么就只能使用Autofac的方式去注册Controller实例,具体操作是在Startup类中添加ConfigureContainer方法,然后注册Controller并声明支持属性注入

public void ConfigureContainer(ContainerBuilder builder) { var controllerBaseType = typeof(ControllerBase); //扫描Controller类 builder.RegisterAssemblyTypes(typeof(Program).Assembly) .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType) //属性注入 .PropertiesAutowired(); }

其次是解决取的问题,这里我们就不需要AddControllersAsServices方法了,因为AddControllersAsServices解决了Controller实例在IOC中存和取的问题,但是这里我们只需要解决Controller取得问题说只需要使用ServiceBasedControllerActivator即可,具体操作是

services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());

仅需要在默认的状态下完成这两步,既可以解决Controller托管到Autofac中并支持属性注入的问题,这也是最合理的方式。当然如果你使用AddControllersAsServices可是可以实现相同的效果了,只不过是没必要将容器重复的放入容器中了。

总结

本文我们讲述了关于ASP.NET Core Controller与IOC结合的问题,我觉得这是有必要让每个人都有所了解的知识点,因为在日常的Web开发中Controller太常用了,知道这个问题可能会让大家在开发中少走一点弯路,接下来我们来总结一下本文大致讲解的内容

首先说明了一个现象,那就是默认情况下Controller并不在IOC容器中,我们也通过几个示例验证了一下。

其次讲解了默认情况下创造Controller实例真正的类ActivatorUtilities,并大致讲解了ActivatorUtilities的用途。

然后我们找到了将Controller托管到IOC容器中的办法AddControllersAsServices,并探究了它的源码,了解了它的工作方式。

最后我们又演示了如何使用最合理的方式将Controller结合Autofac一起使用,并且支持属性注入。

到此这篇关于ASP.NET Core Controller与IOC结合问题整理的文章就介绍到这了,更多相关ASP.NET Core Controller与IOC结合问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/bf1ee1456570f5337e46cd2c59e470f6.html