SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

1、简单实例
    //创建容器
    var builder = new ContainerBuilder();

    //注册类型
    builder.RegisterType<ConsoleOutput>().As<IOutput>();
    builder.RegisterType<TodayWriter>().As<IDateWriter>();

    //builder.RegisterType<TodayWriter>();
    //builder.RegisterType<ConsoleOutput>().As<IOutput>();

    //解析对象
    Container = builder.Build();

    //解析后使用情况
    using (var scope = Container.BeginLifetimeScope())
    {
        //解析某个接口的实例。
        var writer = scope.Resolve<IDateWriter>();
        writer.WriteDate();
    }

1.2、可以预先创建实例进行注册,可以使用RegisterInstance()方法。

1.3、可以使用ExternallyOwned()方法自己可控制对象的生命周期
    var output = new StringWriter();
    builder.RegisterInstance(output)
       .As<TextWriter>()
       .ExternallyOwned();

1.4、根据属性值创建不同对象
    builder.Register<CreditCard>(
      (c, p) =>
        {
          var accountId = p.Named<string>("accountId");
          if (accountId.StartsWith("9"))
          {
            return new GoldCard(accountId);
          }
          else
          {
            return new StandardCard(accountId);
          }
        });

1.4、支持泛型类型使用RegisterGeneric()
    builder.RegisterGeneric(typeof(NHibernateRepository<>))
           .As(typeof(IRepository<>))
           .InstancePerLifetimeScope();

1.5、如果要将组件公开为一组服务以及使用默认服务,请使用以下AsSelf方法
    builder.RegisterType<CallLogger>()
           .AsSelf()
           .As<ILogger>()
           .As<ICallInterceptor>()
1.6、autofac默认服务是以如下为最后一个服务,可以使用PreserveExistingDefaults()方法更改默认服务
    builder.Register<ConsoleLogger>().As<ILogger>();
    builder.Register<FileLogger>().As<ILogger>();
    builder.Register<FileLogger>().As<ILogger>().PreserveExistingDefaults();

2、参数传递注册
2.1 autofac 提供了按照名称、类型、灵活参数匹配
    表达式:builder.Register(c => new ConfigReader("传入参数值")).As<IConfigReader>();
    名称:builder.RegisterType<ConfigReader>()
           .As<IConfigReader>()
           .WithParameter("configSectionName", "传入参数值");
    类型:builder.RegisterType<ConfigReader>()
              .As<IConfigReader>()
              .WithParameter(new TypedParameter(typeof(string), "传入参数值"));
    参数:builder.RegisterType<ConfigReader>()
              .As<IConfigReader>()
              .WithParameter(
                new ResolvedParameter(
                  (pi, ctx) => pi.ParameterType == typeof(string) && pi.Name == "configSectionName",
                  (pi, ctx) => "传入参数值"));
          builder.Register((c, p) =>
                           new ConfigReader(p.Named<string>("configSectionName")))
                 .As<IConfigReader>();
3、程序集注册
    var dataAccess = Assembly.GetExecutingAssembly();
    过滤:builder.RegisterAssemblyTypes(dataAccess)
           .Where(t => t.Name.EndsWith("Repository"));
    排除:builder.RegisterAssemblyTypes(asm)
           .Except<MyUnwantedType>();

     AsImplementedInterfaces() 将类型注册为将其所有公共接口提供为服务(不包括IDisposable)。
     AsClosedTypesOf(open) 注册可分配给已打开泛型类型的已关闭实例的类型。
     AsSelf()  默认值:注册类型为自己的 - 当用另一个服务规范覆盖默认值时也很有用。

4、mvc注册实例
     var builder = new ContainerBuilder();
      // 注册您的MVC控制器。(MvcApplication是 Global.asax中的类
      builder.RegisterControllers(typeof(MvcApplication).Assembly);

      // 可选:注册需要DI的模型活页夹。
      builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
      builder.RegisterModelBinderProvider();

      //可选:注册Web抽象如HttpContextBase。
      builder.RegisterModule<AutofacWebTypesModule>();

      //可选:在视图页面中启用属性注入。
      builder.RegisterSource(new ViewRegistrationSource());

      // 可选:将属性注入到操作过滤器中。
      builder.RegisterFilterProvider();

      // 可选:启用动作方法参数注入(RARE)。
      builder.InjectActionInvoker();

      // Set the dependency resolver to be Autofac.
      var container = builder.Build();
5、api注册
    var builder = new ContainerBuilder();

    // Get your HttpConfiguration.
    var config = GlobalConfiguration.Configuration;

    // Register your Web API controllers.
    builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

    // OPTIONAL: Register the Autofac filter provider.
    builder.RegisterWebApiFilterProvider(config);

    // OPTIONAL: Register the Autofac model binder provider.
    builder.RegisterWebApiModelBinderProvider();

    // Set the dependency resolver to be Autofac.
    var container = builder.Build();

6、配置文件注册
   需在nuget中添加 Microsoft.Extensions.Configuration.Json
   实例地址:http://autofac.readthedocs.io/en/latest/configuration/xml.html#quick-start

 

官网

1、公共

public delegate ContainerBuilder AutofacDele(ContainerBuilder c);

    public class AutofacExtend
    {
        private static IContainer _container { get; set; }

        /// <summary>
        /// 注册事件,默认只运行mvc和api的
        /// </summary>
        public static event AutofacDele AutofacEvent;

        public static void InitAutofac()
        {
            var builder = new ContainerBuilder();

            if(AutofacEvent != null)
                builder = AutofacEvent(builder);

            // MVC注册controller,使用属性注入
            builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();

            // API
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            _container = builder.Build();

            DependencyResolver.SetResolver(new AutofacDependencyResolver(_container)); //mvc
        }

        public static T GetFromFac<T>()
        {
            return _container.Resolve<T>();
        }
    }

 

2、根据不同项目注入

    public class AutofacExt
    {
        /// <summary>
        /// 应用启动时依赖注入
        /// </summary>
        /// <param name="builder"></param>
        /// <returns></returns>
        public static ContainerBuilder AutofacFun(ContainerBuilder builder)
        {
            //注册数据库基础操作和工作单元 泛型注册
            builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IRepository<>));
            builder.RegisterType(typeof(UnitWork)).As(typeof(IUnitWork));
            builder.RegisterType(typeof(AuthoriseFactory));

            //注册app层 组装扫描注册
            builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(ClassifyManagerApp)));
            builder.RegisterType(typeof(ClassifyManagerApp));

            //注册Repository
            builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(UsersRepository)))
            .Where(t => t.Name.EndsWith("Repository"))
            //.Except<BlogsRepository>()  //排除
            .AsImplementedInterfaces();//注册公共所有的接口

            return builder;
        }

        /// <summary>
        /// 初始化
        /// </summary>
        public static void InitAutofac()
        {
            AutofacExtend.AutofacEvent += AutofacFun;
            AutofacExtend.InitAutofac();
        }
    }

3、在Global类中Application_Start或测试类中(在项目执行前)添加

AutofacExt.InitAutofac();

4、GetFromFac方法的只用

【Autofac】 随笔 第1张

【Autofac】 随笔 第2张

【Autofac】 随笔 第3张

 

 

 

 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄