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 集成类库 时你通常不必做在示例应用中的这些事. 这些东西都会在应用的中心,"顶层"的位置得到解决, 人为的处理是极少存在的. 当然, 如何构建你的应用取决于你自身.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐