Autofac 使用经验
慢慢总结
基础使用样例,在 Application_Start 中直接使用
//autofac注册 var builder = new ContainerBuilder(); //注册Controller方式一 自己指定程序集 //var assemblies = new List<Assembly> { Assembly.Load("TestEf.Web") }; //builder.RegisterControllers(assemblies.ToArray()); //注册Controller方式二 当前执行项目的程序集 builder.RegisterControllers(Assembly.GetExecutingAssembly()); //注册泛型类使用 RegisterGeneric builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerLifetimeScope(); builder.Register<IDbContext>(c => new TestEfContext()).InstancePerLifetimeScope(); //注册普通类使用 RegisterType builder.RegisterType<ArticleService>().As<IArticleService>().InstancePerLifetimeScope(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
① 注册 Controller
方式一:
//注册Controller方式一 自己指定程序集 var assemblies = new List<Assembly> { Assembly.Load("TestEf.Web") }; builder.RegisterControllers(assemblies.ToArray());
方式二:
//注册Controller方式二 当前执行项目的程序集 builder.RegisterControllers(Assembly.GetExecutingAssembly());
② 常用接口注册方式
方式一:泛型注册使用 RegisterGeneric
builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerLifetimeScope();
方式二:普通类型使用 RegisterType
builder.RegisterType<ArticleService>().As<IArticleService>().InstancePerLifetimeScope();
③生命周期
InstancePerDependency 默认值,每次解析时都会得到一个新的实例
SingleInstance 单例 每次解析都会得到同一个实例
InstancePerLifetimeScope 同一生命周期内得到相同的实例
InstancePerMatchingLifetimeScope 同一生命周期升级版,可以指定与某个生命周期获取获取相同的实例
InstancePerRequest 根据Request请求来确定,在一个web/http/api的上下文中共享一个组件实例
Thread Scope 线程内共享,没有特定的方法,可以根据 InstancePerMatchingLifetimeScope 来实现
④使用
方式一:在静态方法中,没有构造函数来进行注册
var _articleService = DependencyResolver.Current.GetService<IArticleService>();