Autofac依赖注入

Posted liuchangxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Autofac依赖注入相关的知识,希望对你有一定的参考价值。

Autofac是什么?
Autofac是一种IOC容器,那么什么是IOC容器呢?

先说一下两个概念IOC和DI,我的理解:

  ① IOC:调用者不再创建(不自己new)被调用者的实例,而是交给容器去创建(AutoFac就充当这里的容器),这就是控制反转。

  ② DI:容器创建好的实例再注入调用者的过程,就是依赖注入(比如:属性注入、构造函数注入等)。

控制反转
控制反转背后的核心思想是, 我们不再将类绑定在应用里,让类自己去 "new up" 他们的依赖, 而是反过来在类的构造方法中将依赖传递进去

构建应用

Repository层

 1 public interface IUserRepository
 2     {
 3         List<User> GetModelList(int isEnabled = 1);
 4 
 5     }
 6 
 7  public partial class UserRepository : IUserRepository
 8     {
 9         public List<User> GetModelList(int isEnabled = 1)
10         {
11             var sql = $"select * from [User] where IsEnabled=@IsEnabled ";
12             return DapperHelper.GetModelList<User>(sql, new { IsEnabled = isEnabled });
13         }
14     }

Service层

 1 public interface IUserService : IBaseService<User>
 2     {
 3         List<User> GetModelList(int isEnabled = 1);
 4 
 5     }
 6 
 7 
 8  public partial class UserService : BaseService<User>, IUserService
 9     {
10         private readonly IUserRepository _userRepository;
11 
12         public UserService(IUserRepository userRepository, IBaseRepository<User> baseRepository) : base(baseRepository)
13         {
14             this._userRepository = userRepository;
15         }
16 
17         public List<User> GetModelList(int isEnabled = 1)
18         {
19             return this._userRepository.GetModelList(isEnabled);
20         }
21 
22     }

Web层(注意引用)

 1 public class AutofacConfig
 2     {
 3         /// <summary>
 4         /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序及中的类型对象的创建
 5         /// 负责创建Web控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
 6         /// </summary>
 7 
 8         public static void Register()
 9 
10         {
11 
12             // 实例化一个autofac的创建容器
13 
14             var builder = new ContainerBuilder();
15 
16             SetupResolveRules(builder);
17 
18             //注册所有的Controllers
19 
20             builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
21 
22             // 创建一个autofac的容器
23 
24             var container = builder.Build();
25 
26             // 控制器对象由autofac来创建
27 
28             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
29 
30         }
31 
32 
33 
34         /// <summary>
35         /// 设置配置规则
36         /// </summary>
37         /// <param name="builder"></param>
38 
39         public static void SetupResolveRules(ContainerBuilder builder)
40 
41         {
42             //注册Controller
43 
44             // 告诉autofac框架,将来要创建的控制器类存放在哪个程序集
45             var controllerAssmbly = Assembly.Load("Web");
46             builder.RegisterControllers(controllerAssmbly);
47 
48             //批量注册所有仓储Repository && Service
49             var assemblies = new Assembly[] { Assembly.Load("AutoFac.Repository"), Assembly.Load("AutoFac.Service") }; //声明一个可变数组,可以加载多个类库
50             builder.RegisterAssemblyTypes(assemblies).Where(t => !t.IsAbstract).AsImplementedInterfaces().PropertiesAutowired(); // 获取所有相关类库的程序集
51 
52             //注册泛型仓储
53             builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IBaseRepository<>));
54             //builder.RegisterGeneric(typeof(BaseService<>)).As(typeof(IBaseService<>));
55 
56             //注册log模块
57             //builder.RegisterModule(new LoggingModule());
58 
59         }
60 
61     }

控制器调用

 1 public class HomeController : Controller
 2     {
 3 
 4         private readonly IUserService _userService;
 5         private readonly IRoleService _roleService;
 6         public HomeController(IUserService userService, IRoleService roleService)
 7         {
 8             _userService = userService;
 9             _roleService = roleService;
10         }
11 
12         public ActionResult Index()
13         {
14             var userModel = _userService.GetModel("085AC7C7-94BE-4A41-93C7-C207939714B9");
15 
16             var userList = _userService.GetModelList();
17 
18             var umodel = _userService.Get("085AC7C7-94BE-4A41-93C7-C207939714B9");
19 
20             var predicateList = new List<IPredicate>();
21             predicateList.Add(Predicates.Field<User>(u => u.IsEnabled, Operator.Eq, 1));
22 
23             var userlist = _userService.GetList(new { IsEnabled = 1 }, new List<ISort>() { new Sort { PropertyName = "CreatTime", Ascending = false } });
24 
25             return View();
26         }
27 
28         public ActionResult About()
29         {
30             ViewBag.Message = "Your application description page.";
31 
32             return View();
33         }
34 
35         public ActionResult Contact()
36         {
37             ViewBag.Message = "Your contact page.";
38 
39             return View();
40         }
41     }

 

 

以上是关于Autofac依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

依赖注入之AutoFac

Autofac 依赖注入框架

WebAPI2使用AutoFac依赖注入完整解决方案。

AutoFac实现程序集级别的依赖注入

ASP.NETCore使用AutoFac依赖注入

Autofac依赖注入