【Autofac】

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

 

官网

 

猜你喜欢

转载自www.cnblogs.com/Seven77yixuan/p/10848978.html