代码
#region 自动注入服务
public void ConfigureContainer(ContainerBuilder builder)
{
var assemblysServices = Assembly.Load("Meiam.System.Interfaces");
builder.RegisterAssemblyTypes(assemblysServices)
.InstancePerDependency()//瞬时单例
.AsImplementedInterfaces()自动以其实现的所有接口类型暴露(包括IDisposable接口)
.EnableInterfaceInterceptors(); //引用Autofac.Extras.DynamicProxy;
}
#endregion
项目结构:
这段代码在 Autofac
容器中注册了类型及其依赖关系,并启用了接口拦截功能。它通常出现在 ASP.NET Core
应用程序的 Startup
类中,用于配置依赖注入容器。
代码解释
-
ConfigureContainer
方法:- 这个方法用于配置
Autofac
容器。Autofac
是一个流行的依赖注入(DI)框架,通常用来替代默认的 .NET Core DI 容器。 - 方法的参数
ContainerBuilder
是Autofac
提供的类,用于注册类型和组件。
- 这个方法用于配置
-
Assembly.Load("Meiam.System.Interfaces")
:Assembly.Load
方法加载一个名为"Meiam.System.Interfaces"
的程序集(DLL)。assemblysServices
变量保存该程序集的引用,以便后续使用。
-
builder.RegisterAssemblyTypes(assemblysServices)
:RegisterAssemblyTypes
方法用于批量注册程序集中的所有类型。- 这里是注册从
"Meiam.System.Interfaces"
加载的所有类型。
-
InstancePerDependency()
:- 配置注册类型的生命周期为“瞬时(Transient)”。
- 每次请求时,都会创建一个新的实例。这种方式适用于无状态的对象。
-
AsImplementedInterfaces()
:- 自动将每个注册类型公开为它所实现的所有接口。
- 比如,如果某个类型实现了
IServiceA
和IServiceB
,则它将注册为这两个接口。 - 这意味着在代码的其他地方通过注入接口类型
IServiceA
或IServiceB
时,Autofac 将会解析到该实现类型。
-
EnableInterfaceInterceptors()
:- 启用接口拦截功能,需要引用
Autofac.Extras.DynamicProxy
。 - 这允许在接口实现上使用 AOP(面向切面编程)技术,例如:日志记录、性能监控、事务管理等。
- 使用这个功能后,可以通过拦截器来监控或改变对象方法的调用行为。
- 启用接口拦截功能,需要引用
总结
这段代码利用 Autofac
实现依赖注入,将名为 "Meiam.System.Interfaces"
的程序集中的所有类型注册为它们所实现的接口。所有类型都被注册为瞬时实例,并且支持接口拦截,方便进行 AOP 操作。这样,应用程序在运行时可以通过依赖注入的方式获得这些接口的实现,且具备高度的扩展性和可维护性。
拓展
Autofac
Autofac 是一个功能强大、灵活性高的 DI 容器,适用于大多数 .NET 应用程序。它提供了简洁的 API 和丰富的功能,能够满足复杂的依赖注入需求,是实现解耦和模块化开发的有力工具。
Autofac 的主要特性
-
模块化设计
Autofac 允许将依赖注入配置分成多个模块,支持松耦合和高可维护性的代码结构。 -
生命周期管理
提供了对对象实例生命周期的详细控制,如单例(Singleton)、瞬时(Transient)和范围(Scoped)等模式。 -
支持拦截器和 AOP
Autofac 提供了对面向切面编程(Aspect-Oriented Programming, AOP)的支持,允许你在对象的方法执行之前或之后插入代码逻辑,如日志记录、事务管理等。 -
支持泛型注入
可以注入和解析泛型类型,适用于仓储模式(Repository Pattern)、服务模式(Service Pattern)等场景。 -
灵活的注册方式
支持多种方式注册服务和组件,包括基于类型、基于接口、基于命名、基于程序集扫描等。 -
与 ASP.NET Core 的集成
Autofac 可以无缝集成到 ASP.NET Core 应用程序中,替代默认的服务提供者。 -
条件注册和解析
可以根据特定条件注册和解析依赖,实现更复杂的依赖注入场景。
InstancePerDependency()
InstancePerDependency()
是 Autofac 中用来指定组件的生命周期范围的一个方法。它配置了每次请求时都会创建一个新的实例,即 瞬时(Transient) 生命周期模式。
代码示例
假设我们有一个服务接口 IMyService
和它的实现 MyService
,在使用 InstancePerDependency()
时的行为如下:
public interface IMyService
{
void DoWork();
}
public class MyService : IMyService
{
public void DoWork()
{
Console.WriteLine("Doing work.");
}
}
在 Autofac 中配置这个服务:
var builder = new ContainerBuilder();
builder.RegisterType<MyService>().As<IMyService>().InstancePerDependency();
var container = builder.Build();
每次我们解析 IMyService
时,Autofac 都会创建一个新的 MyService
实例:
using (var scope = container.BeginLifetimeScope())
{
var service1 = scope.Resolve<IMyService>();
var service2 = scope.Resolve<IMyService>();
// service1 和 service2 是两个不同的实例
bool areEqual = Object.ReferenceEquals(service1, service2); // false
}
在上面的代码中,每次调用 Resolve<IMyService>()
都会创建一个新的 MyService
实例,因此 service1
和 service2
是两个不同的对象。