autofac自动注入是通过名称约定来实现依赖注入
ps:本demo接口层都以“i”开头,以“service”结尾。服务层实现都以“service”结尾。
为什么要实现自动注入
大多时候,我们都是 以下方式进行依赖注入
public iserviceprovider configureservices(iservicecollection services) { services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2); //初始化容器 var builder = new containerbuilder(); //管道寄居 builder.populate(services); builder.registertype<testservice>().as<itestservice>();//userservice注入到iuserservice //构造 applicationcontainer = builder.build(); //将autofac反馈到管道中 return new autofacserviceprovider(applicationcontainer); }
随着业务的增长,接口跟实现类会越来越多,还需要手动一个个的注册依赖项,有时候会出现忘了写配置,导致程序报错,如果是多人开发,可能还会导致代码冲突,后期维护起来相对来说比较麻烦。
实用autofac自动注入
public iserviceprovider configureservices(iservicecollection services) { services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2); //初始化容器 var builder = new containerbuilder(); //管道寄居 builder.populate(services); //业务逻辑层所在程序集命名空间 assembly service = assembly.load("netcoredemo.service"); //接口层所在程序集命名空间 assembly repository = assembly.load("netcoredemo.repository"); //自动注入 builder.registerassemblytypes(service, repository) .where(t => t.name.endswith("service")) .asimplementedinterfaces(); //构造 applicationcontainer = builder.build(); //将autofac反馈到管道中 return new autofacserviceprovider(applicationcontainer); }
简单测试
创建iuserservice接口
public interface itestservice { string hello(); }
创建userservice实现类
public class testservice : itestservice { public string hello() { return "hello word"; } }
创建testcontroller控制器
通过控制器的构造方法注入itestservice接口
[route("api/test")] [apicontroller] public class testcontroller : controller { private readonly itestservice _testservice; /// <summary> /// 构造函数 /// </summary> /// <param name="testservice"></param> public testcontroller(itestservice testservice) { _testservice = testservice; } [httpget] public string hello() { var str= _testservice.hello(); return str; } }
运行
黄山市民网:https://www.huangshanshimin.com/