欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用Autofac替换.net core 内置容器

程序员文章站 2022-03-20 13:09:38
官方建议使用内置容器,但有些功能并不支持,如下: 属性注入 基于名称的注入 子容器 自定义生存期管理 Func 支持 属性注入 基于名称的注入 子容器 自定义生存期管理 Func 支持 所以可以使用其他第三方IOC容器,如Autofac,下面为学习使用记录 一、首先准备了一个接口和其实现 ......
官方建议使用内置容器,但有些功能并不支持,如下:
  • 属性注入
  • 基于名称的注入
  • 子容器
  • 自定义生存期管理
  • func<t> 支持

所以可以使用其他第三方ioc容器,如autofac,下面为学习使用记录

一、首先准备了一个接口和其实现类

public interface itestservice
{
    string showmsg();
}

 

public class testservice: itestservice
{
    public string showmsg()
    {
        return "test123";
    }
}

 

二、安装nuget 包

autofac
autofac.extensions.dependencyinjection

 

三、在 startup.configureservices 中配置容器

注:使用第三方容器,startup.configureservices 必须返回 iserviceprovider。

  第一种方式,使用autofacmodule配置文件,原来代码修改为:

public iserviceprovider configureservices(iservicecollection services)
{
    services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2);
    // add autofac
    var containerbuilder = new containerbuilder();
    containerbuilder.registermodule<autofacmodule>();
    containerbuilder.populate(services);
    var container = containerbuilder.build();
    return new autofacserviceprovider(container);
}

autofacmodule类如:

public class autofacmodule: module
{
    protected override void load(containerbuilder builder)
    {
        builder.registertype<testservice>().as<itestservice>();
     //........... } }

 

  第二种方式

startup.configureservices如下修改

public iserviceprovider configureservices(iservicecollection services)
{
    services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2);
    // add autofac
    var containerbuilder = new containerbuilder();
    //containerbuilder.registermodule<autofacmodule>();

   //自动注册该程序集下的所有接口 //netcore_autofac 为程序集命名空间 //instanceperlifetimescope:同一个lifetime生成的对象是同一个实例 //singleinstance:单例模式,每次调用,都会使用同一个实例化的对象;每次都用同一个对象; //instanceperdependency:默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象; containerbuilder.registerassemblytypes(assembly.load("netcore_autofac")).asimplementedinterfaces().instanceperlifetimescope(); containerbuilder.populate(services); var container = containerbuilder.build(); return new autofacserviceprovider(container); }

 

其他autofac在.net core 的使用,请参考官方文档: