.net core通过反射将对象注入DI、IOC容器

定义对象生存周期

	/// <summary>
    /// 瞬时依赖注入
    /// </summary>
    public interface IInstance
    {
        
    }
	/// <summary>
    /// 单例依赖注入
    /// </summary>
    public interface ISingleton
    {
    }
    /// <summary>
    /// 单次请求依赖注入
    /// </summary>
    public interface ITransient
    {
    }

通过反射注册到IOC容器

示例


public static class ContainerBuilder
{
    /// <summary>
    /// 容器
    /// </summary>
    public static IContainer Instance;


    /// <summary>
    /// 自定义注册
    /// </summary>
    /// <param name="builder"></param>
    public static void ContainerRegister(this Autofac.ContainerBuilder builder)
    {
        // 获取程序集,只能获取到启动程序集,以及框架程序集
        var assems = AppDomain.CurrentDomain.GetAssemblies();

        //通过程序集名称获取程序集
        var realize = Assembly.LoadFrom("Realize.dll");

        var assembly = new[] { realize };
        assems.Concat(assembly); //合并程序集
        //注册所有的实现了IDependency接口的类
        foreach (var item in assembly)
        {
            
            foreach(Type type in item.GetTypes())
            {
                if (!type.IsGenericType)
                {
                    if (type.GetInterfaces().Contains(typeof(IInstance)))
                    {
                        builder.RegisterType(type).AsImplementedInterfaces().InstancePerDependency(); // 暴露所有的继承接口
                    }
                    if (type.GetInterfaces().Contains(typeof(ISingleton)))
                    {
                        builder.RegisterType(type).AsImplementedInterfaces().SingleInstance();  // 暴露所有的继承接口
                    }
                    if (type.GetInterfaces().Contains(typeof(ITransient)))  
                    {
                        builder.RegisterType(type).As(type.GetInterfaces().FirstOrDefault()).InstancePerLifetimeScope();  //暴露继承的第一个接口
                    }
                }
                else
                {
                    if (type.GetInterfaces().Contains(typeof(IInstance)))
                    {
                        builder.RegisterGeneric(type).AsSelf().InstancePerDependency();
                    }
                    if (type.GetInterfaces().Contains(typeof(ISingleton)))
                    {
                        builder.RegisterGeneric(type).AsSelf().SingleInstance();
                    }
                    if (type.GetInterfaces().Contains(typeof(ITransient)))
                    {
                        builder.RegisterGeneric(type).AsSelf().InstancePerLifetimeScope();
                    }
                }
            }
        }
        Instance = builder.Build();
    }

}

注册方法说明

// 创建注册组件的builder
var builder = new ContainerBuilder();
 
//根据类型注册组件 ConsoleLogger 暴漏服务:ILogger
builder.RegisterType<ConsoleLogger>().As<ILogger>();
 
//根据类型注册组件 ConsoleLogger,暴漏其实现的所有服务(接口)
builder.RegisterType<ConsoleLogger>().AsImplementedInterfaces();
 
// 根据实例注册组件 output  暴漏服务:TextWriter
var output = new StringWriter();
builder.RegisterInstance(output).As<TextWriter>();
 
//表达式注册组件,这里我们是在构造函数时传参->"musection"   暴漏服务:IConfigReader
builder.Register(c =new ConfigReader("mysection")).As<IConfigReader>();
 
//表达式注册组件,解析时传参
var service = scope.Resolve<IConfigReader>(
           new NamedParameter("section", "mysection"));     
 
//反射注册组件,直接注册了ConsoleLogger类(必须是具体的类),如果ConsoleLogger有多个构造函数,将会取参数最多的那个构造函数进行实例化
builder.RegisterType<ConsoleLogger>();
 
//反射注册组件,手动指定构造函数,这里指定了调用 MyComponent(ILogger log,IConfigReader config)的构造函数进行注册
builder.RegisterType<MyComponent>()
 .UsingConstructor(typeof(ILogger), typeof(IConfigReader));  
 
 //注册MySingleton类中的静态变量"Instance",ExternallyOwned()函数指定自己控制实例的生命周期,而不是由autofac自动释放
 builder.RegisterInstance(MySingleton.Instance).ExternallyOwned();
 
//一个组件暴漏两个服务  
builder.RegisterType<CallLogger>().As<ILogger>().As<ICallInterceptor>(); 
 
//注册当前程序集中以“Service”结尾的类
builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly()).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces();
//注册"MyApp.Repository"程序集中所有的类
builder.RegisterAssemblyTypes(GetAssembly("MyApp.Repository")).AsImplementedInterfaces();
   
//构建一个容器完成注册
var rootcontainer = builder.Build();
 
//可以通过下面这种方式手动获取IConfigReader 的实现类
//这种手动解析的方式需要 从生命周期作用域内获取组件,以保证组件最终被释放
//不要直接从根容器rootcontainer中解析组件,很有可能会导致内存泄漏
using(var scope = rootcontainer.BeginLifetimeScope())
{
  var reader = scope.Resolve<IConfigReader>();
}

替换.net core的IOC容器为autofac

控制台以及windows应用替换方法

var builder = new Autofac.ContainerBuilder();
builder.ContainerRegister();

MVC

待完成

web(非MVC架构)

待完成

使用方法

从容器中解析

// 使用using避免内存泄露
using (var scope =IRepository.ContainerBuilder.Instance.BeginLifetimeScope())
{
    _lolconfig = scope.Resolve<>();
}

// 直接解析
ContainerBuilder.Instance.Resolve<ILOLConfig>();

构造注入

待完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值