Autofac浅学(2)

一、注册概念

使用Autofac 注册组件,通过创建一个ContainerBuilder并且告知builder 哪些组件公开哪些服务

//注册
//ConsoleLogger服务
//ILogger 组件
//意思为ILogger组件公开了ConsoleLogger服务
builder.RegisterType<ConsoleLogger>().As<ILogger>();

基本类

Person

 public interface Person
    {
        void Eat();
        void Say();
    }

Teacher

 public class Teacher:Person
    {
        public void Eat()
        {
            Console.WriteLine("Tea吃早饭");
        }
        public void Say()
        {
            Console.WriteLine("Tea说早安");
        }
    }

Student

public class Student:Person
    {

        public void Eat()
        {
            Console.WriteLine("吃早饭");
        }
        public void Say()
        {
            Console.WriteLine("说早安");
        }

二、反射组件

  #region 通过反射实现
            //创建容器
            var builder = new ContainerBuilder();
            //创建builder,通过反射并在builder中注册类型。
            builder.RegisterType(typeof(Student));
            //实例化容器(可以讲第一步合并进来)
            Container = builder.Build();
            //在需要使用接口的地方,通过container来解析得到一个借口的实例。
            Student student = Container.Resolve<Student>();
            student.Say();
            #endregion

三、实例组件

有时候,您可能希望提前生成一个对象的实例,并将它添加到容器供组件注册使用。你可以这样做,使用RegisterInstance 方法:

 //创建容器
            var builder = new ContainerBuilder();
            //创建builder,并在builder中注册类型。
            var student = new Student();
            builder.RegisterInstance(student).As<Person>().ExternallyOwned();
            //实例化容器(可以讲第一步合并进来)
            Container = builder.Build();
            //在需要使用接口的地方,通过container来解析得到一个借口的实例。
            Person person = Container.Resolve<Person>();
            person.Eat();
            person.Say();

四、默认注册

#region 
            var builder = new ContainerBuilder();
			//Person注册两个服务,因为Teacher是后注册的,所以默认是Teacher服务
            builder.RegisterType<Student>().AsSelf().As<Person>();
            builder.RegisterType<Teacher>().AsSelf().As<Person>();
  
            Container = builder.Build();
            Person person = Container.Resolve<Person>();
            person.Eat();
            person.Say();
            #endregion
//添加.PreserveExistingDefaults()修改默认,变为Student服务
 builder.RegisterType<Teacher>().AsSelf().As<Person>().PreserveExistingDefaults();

五、传递注册参数

Autofac提供数个不同的参数匹配策略:
 
NamedParameter - 通过名称匹配目标参数
 
TypedParameter - 通过类型匹配目标参数(需要精确匹配类型)
 
ResolvedParameter - 灵活的参数匹配

Cat

public class Cat:Animal
    {
        public string Name { get; set; }
        public Cat(string name)
        {
            Name = name;
        }
        public void Eat()
        {
            Console.WriteLine("Cat吃早饭");
        }
        public void Say()
        {
            Console.WriteLine("Cat说早安");
        }
        public void ConsoleName()
        {
            Console.WriteLine(Name);
        }
    }

1.NamedParameter

 #region 传递注册参数
            var builder = new ContainerBuilder();
            //AsSelf()在注册组件同时,注册自己的服务
            builder.RegisterType<Cat>().AsSelf().As<Animal>().WithParameter("name", "lty");
            Container = builder.Build();
            var instance = Container.Resolve<Cat>();
            instance.Eat();
            instance.Say();
            instance.ConsoleName();
            #endregion

2.TypedParameter

//对比
builder.RegisterType<Cat>().AsSelf().As<Animal>().WithParameter("name", "lty");
//TypedParameter
 builder.RegisterType<Cat>().AsSelf().As<Animal>().WithParameter(new TypedParameter(typeof(string), "lty"));

3.ResolvedParameter

//对比
builder.RegisterType<Cat>().AsSelf().As<Animal>().WithParameter("name", "lty");
//ResolvedParameter 
			builder.RegisterType<Cat>().AsSelf().As<Animal>()
                .WithParameter(
                new ResolvedParameter(
                        (pi, ctx) => pi.ParameterType == typeof(string) && pi.Name == "name",
                        (pi, ctx) => "lty"
                    )
                );

lamda注册

//对比
builder.RegisterType<Cat>().AsSelf().As<Animal>().WithParameter("name", "lty");
//lamda
builder.Register(c => new Cat("lty")).As<Animal>();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有诗亦有远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值