Autofac浅学
一、注册概念
使用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>();