.NET Core Web api 有关依赖的自动注入

代码

#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 类中,用于配置依赖注入容器。

代码解释

  1. ConfigureContainer 方法:

    • 这个方法用于配置 Autofac 容器。Autofac 是一个流行的依赖注入(DI)框架,通常用来替代默认的 .NET Core DI 容器。
    • 方法的参数 ContainerBuilderAutofac 提供的类,用于注册类型和组件。
  2. Assembly.Load("Meiam.System.Interfaces"):

    • Assembly.Load 方法加载一个名为 "Meiam.System.Interfaces" 的程序集(DLL)。
    • assemblysServices 变量保存该程序集的引用,以便后续使用。
  3. builder.RegisterAssemblyTypes(assemblysServices):

    • RegisterAssemblyTypes 方法用于批量注册程序集中的所有类型。
    • 这里是注册从 "Meiam.System.Interfaces" 加载的所有类型。
  4. InstancePerDependency():

    • 配置注册类型的生命周期为“瞬时(Transient)”。
    • 每次请求时,都会创建一个新的实例。这种方式适用于无状态的对象。
  5. AsImplementedInterfaces():

    • 自动将每个注册类型公开为它所实现的所有接口。
    • 比如,如果某个类型实现了 IServiceAIServiceB,则它将注册为这两个接口。
    • 这意味着在代码的其他地方通过注入接口类型 IServiceAIServiceB 时,Autofac 将会解析到该实现类型。
  6. EnableInterfaceInterceptors():

    • 启用接口拦截功能,需要引用 Autofac.Extras.DynamicProxy
    • 这允许在接口实现上使用 AOP(面向切面编程)技术,例如:日志记录、性能监控、事务管理等。
    • 使用这个功能后,可以通过拦截器来监控或改变对象方法的调用行为。

总结

这段代码利用 Autofac 实现依赖注入,将名为 "Meiam.System.Interfaces" 的程序集中的所有类型注册为它们所实现的接口。所有类型都被注册为瞬时实例,并且支持接口拦截,方便进行 AOP 操作。这样,应用程序在运行时可以通过依赖注入的方式获得这些接口的实现,且具备高度的扩展性和可维护性。

拓展

Autofac

Autofac 是一个功能强大、灵活性高的 DI 容器,适用于大多数 .NET 应用程序。它提供了简洁的 API 和丰富的功能,能够满足复杂的依赖注入需求,是实现解耦和模块化开发的有力工具。

Autofac 的主要特性
  1. 模块化设计
    Autofac 允许将依赖注入配置分成多个模块,支持松耦合和高可维护性的代码结构。

  2. 生命周期管理
    提供了对对象实例生命周期的详细控制,如单例(Singleton)、瞬时(Transient)和范围(Scoped)等模式。

  3. 支持拦截器和 AOP
    Autofac 提供了对面向切面编程(Aspect-Oriented Programming, AOP)的支持,允许你在对象的方法执行之前或之后插入代码逻辑,如日志记录、事务管理等。

  4. 支持泛型注入
    可以注入和解析泛型类型,适用于仓储模式(Repository Pattern)、服务模式(Service Pattern)等场景。

  5. 灵活的注册方式
    支持多种方式注册服务和组件,包括基于类型、基于接口、基于命名、基于程序集扫描等。

  6. 与 ASP.NET Core 的集成
    Autofac 可以无缝集成到 ASP.NET Core 应用程序中,替代默认的服务提供者。

  7. 条件注册和解析
    可以根据特定条件注册和解析依赖,实现更复杂的依赖注入场景。

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 实例,因此 service1service2 是两个不同的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值