.net5 IOC原理+手动创建IOC容器
IOC容器 说白了就是创建对象的(看成创建对象的一个工厂)
而在**.net5以及.net core** 项目中自带容器(IserviceCollection)
也可以用更强大的第三方容器Autofac
下面来实现一下简单制作一个容器
手动建立IOC容器
原理:就是通过反射+特性的方式来创建对象
代码案例
创建个容器抽象
public interface ICustomeContainer
{
//注册
void RegisterType<TFrom, TTo>(CustomeLifetime lifetime = CustomeLifetime.Transient) where TTo : TFrom;
//创建
T Resolve<T>();
}
创建对应的实现
public class CustomeContainer : ICustomeContainer
{
/// <summary>
/// 定义参数字典
/// </summary>
private Dictionary<string, RegisterInfo> ContainerDicationary = new Dictionary<string, RegisterInfo>();
/// <summary>
/// 添加服务
/// </summary>
/// <typeparam name="TFrom"></typeparam>
/// <typeparam name="TTo"></typeparam>
/// <param name="lifetime"></param>
public void RegisterType<TFrom, TTo>(CustomeLifetime lifetime = CustomeLifetime.Transient) where TTo : TFrom
{
ContainerDicationary.Add(typeof(TFrom).FullName, new RegisterInfo()
{
TargetType = typeof(TTo),
LifeTime = lifetime
});
}
/// <summary>
/// 创建对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T Resolve<T>()
{
//反射创建对象
string abstartName = typeof(T).FullName;//得到程序集+类名
RegisterInfo registerInfo = ContainerDicationary[abstartName];//根据类型从字典得到RegisterInfo对象
Type type = registerInfo.TargetType;//反射
T result = default(T);
result = (T)this.ObjectInstance(type);
return result;
}
private object ObjectInstance(Type type)
{
ConstructorInfo ctor = type.GetConstructors().OrderByDescending(c => c.GetParameters().Length).First();
object oInstance = Activator.CreateInstance(type);//调用无参构造
return oInstance;
}
}
生命周期枚举
public enum CustomeLifetime
{
/// <summary>
/// 瞬时
/// </summary>
Transient,
/// <summary>
/// 单例
/// </summary>
Singleton,
/// <summary>
/// 作用域
/// </summary>
Scope
}
对象实体
public class RegisterInfo
{
/// <summary>
/// 目标类型
/// </summary>
public Type TargetType { get; set; }
/// <summary>
/// 生命周期
/// </summary>
public CustomeLifetime LifeTime { get; set; }
}
最后再创建业务接口和实现
public interface IService
{
void Login();
}
class Service : IService
{
public Service()
{
Console.WriteLine("Service被构造");
}
public void Login()
{
Console.WriteLine("这是Service的登录方法!!");
}
}
Program调用创建对象
ICustomeContainer container = new CustomeContainer();//创建容器
container.RegisterType<IService, Service>();
IService service = container.Resolve<IService>();//获取对象的实例
service.Login(); //
都是这么几个路数,
创建容器
把服务和实现放进容器
生命周期申明
获取对象