


















Autofac入门 AutoFac在MVC使用 NetFramework用Autofac依赖注入 理论基础+实战实现AutoFac注入
NopConfig-IConfigurationSectionHandler使用
一、 组件注册方式
builder.RegisterType<ExposureInfoViewModel>().AsSelf().SingleInstance();
var mySingleton = new MySingletonClass(); builder.RegisterInstance(mySingleton).As<ISingletonService>();
场景:
public class DataAccessModule : Module
{
public string ConnectionString { get; set; }
protected override void Load(ContainerBuilder builder)
{
// 在这个模块内部,你可以像在外部一样使用 builder 进行注册
builder.RegisterType<SqlUserRepository>()
.As<IUserRepository>()
.WithParameter(“connectionString”, ConnectionString) // 可以使用模块的属性来配置
.InstancePerLifetimeScope();
builder.RegisterType<SqlOrderRepository>()
.As<IOrderRepository>()
.WithParameter(“connectionString”, ConnectionString)
.InstancePerLifetimeScope();
// 也可以注册其他模块
// builder.RegisterModule(new LoggingModule());
}
}
//写法一:需要手动创建模块实例、可以在注册前对模块进行配置、适用于需要传递参数的模块
builder.RegisterModule(new DataAccessModule { ConnectionString = “MyConnString” });
//写法二:Autofac 会自动实例化模块、代码更简洁、要求模块有无参构造函数
builder.RegisterModule<DataAccessModule >()
Global.asax 或 Program.cs 中的代码更简洁。Load 方法中编写逻辑,实现有条件的动态注册。builder.RegisterType<ExposureInfoViewModel>().AsSelf().SingleInstance();
- builder.RegisterType<ExposureInfoViewModel>():告诉 Autofac 容器注册 ExposureInfoViewModel 类型。这样,当你需要 ExposureInfoViewModel 的实例时,Autofac 能自动创建并注入它。 - .AsSelf():指定注册时以自身类型(ExposureInfoViewModel)来解析。也就是说,只有请求 ExposureInfoViewModel 时才会返回这个实例,而不是以接口或基类的方式。 - .SingleInstance():指定该类型在整个容器生命周期内只创建一个实例(单例模式)。所有请求都会获得同一个 ExposureInfoViewModel 实例。
builder.RegisterType<McsfLoggerFactory>().As<ILoggerFactory>().SingleInstance(); - .As<ILoggerFactory>():注册时,声明当请求 ILoggerFactory 接口时,实际提供 McsfLoggerFactory 的实例。也就是说,依赖注入时如果有类需要 ILoggerFactory,Autofac 会注入 McsfLoggerFactory。
builder.RegisterType<MultiService>().As<IServiceA>().As<IServiceB>().SingleInstance();
- .As<IServiceA>().As<IServiceB>():允许单个实现类同时作为多个接口的服务提供者,解析IServiceA或IServiceB时返回同一对象实例
- 典型场景:
- 日志服务同时实现IFileLogger和IConsoleLogger
- 数据访问层同时支持IRepository和IQueryProvider接口
builder.RegisterType<MyService>().As<IMyService>().AsSelf(); - .As<IMyService>().AsSelf():既可通过IMyService解析,也可直接解析MyService类型 - 典型场景: - 需要直接访问实现类特有方法(非接口声明的方法) - 单元测试中需Mock具体类而非接口
using Autofac;
using System;
public interface IService { Guid Id { get; } }
public class MyService : IService
{
public Guid Id { get; } = Guid.NewGuid();
}
class Program
{
static void Main()
{
var builder = new ContainerBuilder();
// 关键注册:配置单例生命周期
builder.RegisterType<MyService>().As<IService>().SingleInstance();
using (var container = builder.Build())
{
// 测试单例行为
using (var scope1 = container.BeginLifetimeScope())
{
var service1 = scope1.Resolve<IService>();
var service2 = scope1.Resolve<IService>();
Console.WriteLine($"同作用域实例比对: {service1.Id == service2.Id}"); // True
}
// 新建作用域测试
using (var scope2 = container.BeginLifetimeScope())
{
var service3 = scope2.Resolve<IService>();
var service4 = scope2.Resolve<IService>();
Console.WriteLine($"跨作用域实例比对: {service3.Id == service4.Id}"); // True
}
}
}
}
using Autofac;
using System;
public interface ILogger { void Log(string message); }
public class ConsoleLogger : ILogger
{
private Guid _id = Guid.NewGuid();
public void Log(string message) =>
Console.WriteLine($"[实例ID:{_id}] {message}");
}
class Program
{
static void Main()
{
var builder = new ContainerBuilder();
// 关键注册:配置瞬时生命周期(默认行为,显式声明更清晰)
builder.RegisterType<ConsoleLogger>().As<ILogger>().InstancePerDependency();
using (var container = builder.Build())
{
// 同一作用域内解析两次
using (var scope = container.BeginLifetimeScope())
{
var logger1 = scope.Resolve<ILogger>();//每次调用Resolve()都会生成全新实例,通过Guid验证实例唯一性
var logger2 = scope.Resolve<ILogger>();
logger1.Log("第一次调用"); // 输出不同实例ID
logger2.Log("第二次调用");
}
}
}
}
???builder.RegisterInstance(ConsoleLogger).As<ILogger>().InstancePerDependency(); 每次请求得到的是同一个实例吗?
答:RegisterInstance和InstancePerDependency本身是矛盾且无效的,最终的行为将由容器决定,但通常会产生非预期的结果。
BeginLifetimeScope()创建作用域,避免内存泄漏 
using Autofac;
using System;
public interface IService { void Execute(); }
public class MyService : IService
{
public void Execute() => Console.WriteLine($"实例ID: {this.GetHashCode()}");
}
class Program
{
static void Main()
{
var builder = new ContainerBuilder();
// 关键注册:配置作用域生命周期
builder.RegisterType<MyService>().As<IService>().InstancePerLifetimeScope();
using (var container = builder.Build())
{
// 场景1:同一作用域内实例共享
using (var scope1 = container.BeginLifetimeScope())
{
var s1 = scope1.Resolve<IService>();
var s2 = scope1.Resolve<IService>();
s1.Execute(); // 输出相同哈希值
s2.Execute();
}
// 场景2:不同作用域创建新实例
using (var scope2 = container.BeginLifetimeScope())
{
var s3 = scope2.Resolve<IService>();
s3.Execute(); // 输出与scope1不同的哈希值
}
}
}
}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。