.NET Core 使用 Autofac 依赖注入

ASP.NET Core 依赖注入   
ASP.NET Core  Autofac  
ASP.NET Core 数据库访问
*、
*、
*、
*、1、管理 NuGet 程序包
     添加 Autofac 、Autofac.Extensions.DependencyInjection 的引用

.NET Core 使用 Autofac 依赖注入_第1张图片
2、Startup.cs 代码
     ● 将 Startup.cs 中的 ConfigureServices 返回类型改为 IServiceProvider;
     新建一个 RegisterAutofac 方法,把创建容器的代码放到其中;
     新建一个 AutofacModuleRegister 类,继承 Autofac的Module;
     重写 Module 的 Load 方法,来存放新组件的注入代码,避免 Startup.cs 文件代码过多混乱;

// This method gets called by the runtime. Use this method to add services to the container.
//public void ConfigureServices(IServiceCollection services)
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.Configure(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    /// 注册Autofac
    return RegisterAutofac(services);
}
private IServiceProvider RegisterAutofac(IServiceCollection services)
{
    //实例化Autofac容器
    var builder = new ContainerBuilder();
    //将Services中的服务填充到Autofac中
    builder.Populate(services);
    //新模块组件注册    
    builder.RegisterModule();
    //创建容器
    var Container = builder.Build();
    //第三方IOC接管 core内置DI容器 
    return new AutofacServiceProvider(Container);
}
using Autofac;
using System.Reflection;

public class AutofacModuleRegister : Autofac.Module
{
    //重写Autofac管道Load方法,在这里注册注入
    protected override void Load(ContainerBuilder builder)
    {
        //以普通类的形式注册PlayPianoService
        //builder.RegisterType();

        //注册Service中的对象,Service中的类要以Service结尾,否则注册失败
        builder.RegisterAssemblyTypes(GetAssemblyByName("WXL.Service")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();
        //注册Repository中的对象,Repository中的类要以Repository结尾,否则注册失败
        builder.RegisterAssemblyTypes(GetAssemblyByName("WXL.Repository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces();
    }

    /// 
    /// 根据程序集名称获取程序集
    /// 
    /// 程序集名称
    /// 
    public static Assembly GetAssemblyByName(String AssemblyName)
    {
        return Assembly.Load(AssemblyName);
    }
}

*
*
*
3、Startup.cs
*
4、
*
5、
*、
*、
-------------------------- ASP.NET Core 依赖注入 --------------------------
1、使用扩展方法 AddDbContext 和 AddIdentityCore 向容器添加附加服务

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddSingleton(Configuration.GetConnectionString("DefaultConnection"));
    services.AddScoped();

    services.AddTransient((sp) => new SqlConnection(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity()
        .AddEntityFrameworkStores()
        .AddDefaultTokenProviders();
}

2、服务生存期
AddTransient:暂时生存期服务,是每次从服务容器进行请求时创建的。 这种生存期适合轻量级、 无状态的服务。
AddScoped:作用域生存期服务,以每个客户端请求(连接)一次的方式创建。
AddSingleton:单一实例生存期服务,是在第一次请求时(或者在运行 Startup.ConfigureServices 并且使用服务注册指定实例时)创建的。
*、
*、
3、实体框架上下文
AddDbContext
services.AddSingleton(Configuration.GetConnectionString("DefaultConnection"));
services.AddScoped();
services.AddSingleton();//获取header参数
*
*
*
*、批量注入

var assembly = Assembly.GetExecutingAssembly().DefinedTypes.Where(a => a.Name.EndsWith("Service") && !a.Name.StartsWith("I"));
foreach (var item in assembly)
{
    services.AddTransient(item.GetInterfaces().FirstOrDefault(), item);
}

*、
*、Redis注入

services.AddSingleton(k => { return new RedisConnection(6, Configuration["RedisConnectionString"]); });

方式一

services.AddSingleton(x =>
             { return x.GetService().ConnectionMultiplexer; });

方式二

var sp = services.BuildServiceProvider();
services.AddSingleton((x) => { return sp.GetService().ConnectionMultiplexer; });

方式三

services.AddScoped();

在 Startup.cs 类 ConfigureServices 方法中注入  IHttpContextAccessor

services.AddSingleton();

*、
*、
*、
*、
*、
*、
*、
*、
*、

你可能感兴趣的:(.NET,Core,依赖注入)