【Autofac】
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方法的只用
