ASP.NET Core 程序集注入(三)

前言:

在Autofac的使用中,提供了个种注入的API其中GetAssemblies()用着特别的舒坦。

1、core2.0也可以使用Autofac的包,但框架自身也提供了默认的注入Api,IServiceCollection(Transient、AddSingleton、Scoped)

services.AddTransient<IUserRepositiry, UserRepositiry>();
services.AddSingleton<IUserRepositiry, UserRepositiry>();
services.AddScoped<IUserRepositiry, UserRepositiry>();

上面是框架自带的注入(如果有100个类,那岂不是要写100遍,脑壳痛。。。)

2、按程序集实现依赖注入

public static class MyDependencyInjection
{
    public static void RegisterAssembly(this IServiceCollection service, string assemblyName, ServiceLifetime serviceLifetime = ServiceLifetime.Transient)
    {
        //加载程序集
        var assemblies = AppDomain.CurrentDomain.Load(assemblyName);
        if(assemblies == null)
            throw new ArgumentNullException(nameof(assemblies) + "不存在!");
        //获取该程序集中包含'Service'的类
        var types = assemblies.GetTypes().Where(x => x.Name.Contains("Service") && !x.IsAbstract && !x.IsGenericType);
        if(types == null)
            throw name ArgumentNullException(nameof(types) + "为空!");
        foreach(var item in types)
        {
            var inter = item.GetInterfaces()?.First();
            if(inter == null) continue;
            //以何种方式注入
            switch(serviceLifetime)
            {
                case ServiceLifetime.Transient:
                    service.AddTransient(item, inter);
                    break;
                case ServiceLifetime.Singleton:
                    service.AddSingleton(item, inter);
                    break;
                case ServiceLifetime.Scoped:
                    service.AddScoped(item, inter);
                    break;
            }
        }
    }
}

在Startup.cs的 ConfigureServices(IServiceCollection services)方法中调用

services.RegisterAssembly("Repository");

这样就实现了!

猜你喜欢

转载自www.cnblogs.com/zhaoshujie/p/12212856.html