Autofac学习系列之-入门

原文:https://blog.csdn.net/huan13479195089/article/details/88738451

Autofac是什么?

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

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

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

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

控制反转

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

Autofac入门

将Autofac整合到你的应用的基本模式如下:

  • 按照 控制反转 (IoC) 的思想构建你的应用.
  • 添加Autofac引用.
  • 在应用的 startup 处...
  • 创建 ContainerBuilder.
  • 注册组件.
  • 创建容器,将其保存以备后续使用.
  • 应用执行阶段...
  • 从容器中创建一个生命周期.
  • 在此生命周期作用域内解析组件实例.

构建应用

新建一个MVC应用如下

Model层

复制代码
using System;
 
namespace AutoFac.Model
{
    public class UserModel
    {
        public string UserId { get; set; }
 
        public string UserName { get; set; }
 
        public DateTime CreateDate { get; set; }
    }
复制代码

 

Repository层

复制代码
using AutoFac.Model;
 
namespace AutoFac.Repository.IRepository
{
    public interface IUserRepository
    {
        void AddUser(UserModel model);
    }
}
复制代码
复制代码
using AutoFac.Model;
using AutoFac.Repository.IRepository;
 
namespace AutoFac.Repository.Repository
{
    public class UserRepository:IUserRepository
    {
        public void AddUser(UserModel model)
        {
            //do something
        }
    }
}
复制代码

 

Service层

复制代码
using AutoFac.Model;
 
namespace AutoFac.Service
{
    public interface IUser
    {
        void Add(UserModel model);
    }
}
复制代码
复制代码
using AutoFac.Model;
using AutoFac.Repository.IRepository;
 
namespace AutoFac.Service
{
    public class User:IUser
    {
        private IUserRepository _userRepository;
        public User(IUserRepository userRepository)
        {
            this._userRepository = userRepository;
        }
 
        public void Add(UserModel model)
        {
            this._userRepository.AddUser(model);
        }
    }
}
复制代码

 

Web层(注意引用)

复制代码
using System.Reflection;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;
using AutoFac.Repository.IRepository;
using AutoFac.Repository.Repository;
using AutoFac.Service;
namespace AutoFacDemo.App_Start
{
    public class AutoFacManager
    {
        public static void RegisterAutoFac()
        {
            var builder = new ContainerBuilder();
 
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            builder.RegisterType<User>().As<IUser>().InstancePerLifetimeScope();
            builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerDependency();
            var container = builder.Build();
            var resovler = new AutofacDependencyResolver(container);
            DependencyResolver.SetResolver(resovler);
        }
    }
}
复制代码

 

控制器调用

复制代码
using AutoFac.Model;
using AutoFac.Service;
using System.Web.Mvc;
 
namespace AutoFacDemo.Controllers
{
    public class HomeController : Controller
    {
        private IUser _user;
        public HomeController(IUser user)
        {
            _user = user;
        }
        public ActionResult Index()
        {
            var model = new UserModel();
            model.UserId = "12312";
            model.UserName = "测试";
            _user.Add(model);
            return View();
        }
    }
}
复制代码

 

现在当运行程序时...

  • Add方法手动地从生命周期中解析 IUser . (这就是 "服务定位.") 在内部地...
    • Autofac发现 IUser 对应 User因此开始创建 User.
    • Autofac发现 User在它构造方法中需要一个 IUserRepostiory. (这就是 "构造方法注入.")
    • Autofac发现 IUserRepostiory对应 UserRepostiory 因此开始创建新的 UserRepostiory实例.
    • Autofac使用新的 UserRepostiory实例完成 User 的创建.
    • Autofac返回完整构建的 User给"Add"使用.

注意: 通常来说, 服务定位模式大多情况应被看作是一种反模式  也就是说, 在代码中四处人为地创建生命周期而少量地使用容器并不是最佳的方式. 使用 Autofac 集成类库 时你通常不必做在示例应用中的这些事. 这些东西都会在应用的中心,"顶层"的位置得到解决, 人为的处理是极少存在的. 当然, 如何构建你的应用取决于你自身.

posted @   Tozhang  阅读(197)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示