Autofac IoC容器基本使用步骤【1】

本文介绍控制反转(IoC)的概念及其如何减少程序耦合,并通过Autofac演示如何实现IoC容器的配置与使用,包括组件注册、创建容器及解析组件实例等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://www.bkjia.com/Asp_Netjc/888119.html  【原文中有一个地方报错,下面已修改】

一.基本步骤:

1.设计适合控制反转(IoC)的应用程序

2.给应用程序Autofac 引用.

3.注册组件.

4.创建一个Container以备后用.

5.从Container创建一个 lifetime scope .

6.使用这个Lifetime Scope 来解析组件的实例.

二.详细介绍:

1.什么是控制反转?

  控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI。IoC就是IoC,不是什么技术,与GoF一样,是一种 设计模式

  Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:AInterface a = new AInterfaceImp(); 这样一来,耦合关系就产生了;而采用了IoC之后,我们的就把创建接口的一个实例交给IoC容器.从而实现了解耦.

所以我们在编程的时候的原则之一就是"针对接口编程",这里的"接口"不是指一要是个接口类型,它可以是C#语言中的接口类型,也可以一个具体的父类.

   public interface  ILcService
    {
        string ServiceName { get; }
    }

    public  class LcService:ILcService
    {

        public string ServiceName
        {
            get;
            set;
        }
    }


2.怎么添加Autofac的引用?

  1)我们可以到Autofac官网下载dll文件,然后在Visualstudio的项目中添加引用

 

   2)也可以使用NuGet 安装autofac包.

 3.怎样注册组件?

   在Autofac中,我们使用一个ContainerBuilder类的实例来注册我们的我们的组件. Autofac提供了Register方法家族,方便我们注册组件.

            ContainerBuilder builder = new ContainerBuilder();

            //builder.RegisterType<ILcService>().As<LcService>().InstancePerDependency();
//此处报错: The type 'AutofacIocApp.ILcService' is not assignable to service 'AutofacIoc’
//原文中注册顺序写反了, An IDynamicQuery is not a DynamicQuery but a DynamicQuery IS an IDynamicQuery.
    builder.RegisterType<LcService>().As<ILcService>().InstancePerDependency();

4.创建一个Container以备后用.
直接调用ContainerBuilder类实例的build()即可.

    var container = builder.Build();

5.创建一个Lifetime Sope.

      var lifetimescope = container.BeginLifetimeScope();

6.得到我们需要的的实例.

        ILcService service = lifetimeScope.Resolve<ILcService>();     

 

  我们可以在最后看的出来,使用了IoC之后,就符合设计模式中要求的"针对接口编程,不针对实现编程";创建实例不是使用New关键字创建,而是创建实例的工作交给了IoC容器,这就实现了关系解耦,可以在IoC容器中随便的替换具体的实现类了.

     还有个问题就是"为什么不直接从Container中直接解析出具体的实例,而要创建一个LifetimeScope,再从它里面解析?"

   这个就是考虑到内存泄露问题.  LifetimeScope用完了,就释放了,它里面的实例也跟着释放了,就不会出现内存泄露,Container是个root ,永远不会释放,如果他里面存在实例.就有可能存在内存泄露问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值