zoukankan      html  css  js  c++  java
  • Autofac IoC容器基本使用步骤【1】

    原文: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 ,永远不会释放,如果他里面存在实例.就有可能存在内存泄露问题.

  • 相关阅读:
    IntelliJ Idea使用代码折叠
    c# 文件属性读取操作及文件之间操作
    c#文件操作
    c++头文件 #include<iostream>
    基本SQL语句
    dd
    c#属性中的get和set属性
    c#
    c#运算表达式
    c#方法
  • 原文地址:https://www.cnblogs.com/jimcsharp/p/6651552.html
Copyright © 2011-2022 走看看