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