AutoFac使用笔记以及操作技巧(保姆级操作)

背景:

AutoFac是解决项目耦合的比较不错的框架.是构建大型项目上的一把利器.这里就记录一下安装以及使用的过程以及心得.方便新手尽快上手

使用过程:

1.安装:

2.引入命名空间:

3.两个部分,注册+使用:

        ///注册容器
        public Autofac.ContainerBuilder servers
        {
            get; set;
        }
        ///从容器中获取服务的方式
        public Autofac.IContainer container
        {
            get; set;
        }

4.创建实用案例:

封装AutoFac; 创建接口 IAnimation->抽象类 AnimationBase ->三个实现类LineAnimation,SinAnimation,CosinAnimation; 以及 测试类 AnimationTest

实现如下:

   public interface IAnimation
    {
        string Name
        {
            get;set;
        }
        void PrintF(string str);
    }

    public abstract class AnimationBase : IAnimation
    {
        public string Name
        {
            get;set;
        }

        public virtual void PrintF(string str)
        {

        }
    }

    public class LineAnimation : AnimationBase
    {
        public LineAnimation():base()
        {
            Name = "LineServer";
        }

        public override void PrintF(string str)
        {
            Console.WriteLine($"{Name}: {str}");
        }
    }

    public class SinAnimation : AnimationBase
    {
        public SinAnimation() : base()
        {
            Name = "SinServer";
        }

        public override void PrintF(string str)
        {
            Console.WriteLine($"{Name}: {str}");
        }
    }

    public class CosinAnimation : AnimationBase
    {
        public CosinAnimation() : base()
        {
            Name = "CosinServer";
        }

        public SinAnimation ISinServer
        {
            get;set;
        }

        public override void PrintF(string str)
        {
            ISinServer?.PrintF("属性注入之: Sin");
            Console.WriteLine($"{Name}: {str}");
        }
    }


    public class IOC
    {
        public Autofac.ContainerBuilder servers
        {
            get; set;
        }
        public Autofac.IContainer container
        {
            get; set;
        }

        public IOC()
        {
            servers = new ContainerBuilder();
        }

        /// 
        /// 添加服务并注入.
        /// 
        public virtual void InitServersAction(Action action)
        {
            if (servers == null) servers = new ContainerBuilder();
            {
                action();
            }

            container = servers.Build();
        }

        public IServer GetServer()
        {
           return container.Resolve();
        }

    }


    public class AnimationTest
    {

        public AnimationTest(IAnimation IAniFace)
        {
            gAnimation = IAniFace;
        }
        public AnimationTest()
        {
           
        }
        private IAnimation gAnimation
        {
            get;set;
        }

        public void SetIAniamtion(IAnimation? IAniFace)
        {
            gAnimation = IAniFace;
        }

        public void PrintInfo()
        {
            gAnimation?.PrintF("测试服务");
        }

    }

 5:实例讲解,以及使用方式

 5.1,默认为构造函数注入,属性注入,函数注入

 IOC gIoc = new IOC();

gIoc.InitServersAction(()=> {

   //通过实例注入.
gIoc.servers.RegisterType().As().InstancePerLifetimeScope().PreserveExistingDefaults();

gIoc.servers.RegisterType().As().InstancePerLifetimeScope();  //这个方式好,同时替代上面三行代码


//属性注入CosAnimation 
gIoc.servers.RegisterType().PropertiesAutowired();

gIoc.servers.RegisterType().InstancePerLifetimeScope();//方式一 ok 常用.

});

5.2 调用:

 AnimationTest Test = gIoc.GetServer();
 首先,这服务默认最后注册的SinAnimation,做为服务.
 Test.PrintInfo();
 更新服务.
 Test.SetIAniamtion(gIoc.GetServer());
 Test.PrintInfo();

 ///获取Cosin服务,查看里面是否通过属性注入了Sin服务.
 var ConsServer = gIoc.GetServer();
 ConsServer.PrintF("Cos: ");//成功,里面的属性Sin服务,注册成功.
           

5.3 输出结果:

AutoFac使用笔记以及操作技巧(保姆级操作)_第1张图片

 5.4: 内部的实现原理简单总结为:

因为AutoFac里面的内部实现基本是DIctionary,或者 MultyDictionary<...>,这样的一个集合,所以,我们要保证通过接口注册的,使用接口获取服务,通过实例注册的,通过实例获取服务. 否则容易造成获取不到服务.

你可能感兴趣的:(C#,WPF,使用技巧总结,c#,WPF)