.net 8使用autofac以及.net core自带的注入

.net 8配置Autofac
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

//autofac注册到builder
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

//服务注册到autofac
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
    // 示例1:注册单个服务(作用域生命周期)
    containerBuilder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();

    // 示例2(推荐):批量注册程序集中所有服务
    containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly)
        .Where(t => t.Name.EndsWith("Service"))
        .AsImplementedInterfaces()
        .InstancePerLifetimeScope();
});

 2.手动批量注入

        public static void AddBusinessServicesForSQLSugar(this IServiceCollection services)
        {
            var basePath = AppContext.BaseDirectory;
            var servicesDllFile = Path.Combine(basePath, "MedicTechService.dll");
            var sugarRepositoryDllFile = Path.Combine(basePath, "MedicTech.Repository.dll");
            // 加载程序集
            var serviceAssembly = Assembly.LoadFrom(servicesDllFile);
            var sugarRepositoryAssembly = Assembly.LoadFrom(sugarRepositoryDllFile);
            // 自动注册泛型 Repository
            var baseRepositoryInterface = typeof(IBaseRepository<,>);
            var baseRepositoryImplementation = typeof(MedicTech.Repository.Base.BaseRepository<,>);
            // Fix for CS0119: Ensure the correct syntax is used for registering services in the IServiceCollection.
            services.AddScoped<IUnitOfWorkManage, UnitOfWorkManage>();
            services.AddScoped(baseRepositoryInterface, baseRepositoryImplementation);

            //  获取服务程序集中定义的所有接口
            var serviceInterfaceTypes = serviceAssembly.GetTypes()
                .Where(t => t.IsInterface)
                .ToDictionary(t => t.Name, t => t);

            var repositoryTypes = sugarRepositoryAssembly.GetTypes()
                .Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith("Repository") && !t.IsGenericType)
                .ToList();

            foreach (var repoType in repositoryTypes)
            {
                //var interfaceType = repoType.GetInterfaces()
                //    .FirstOrDefault(i => i.Name == $"I{repoType.Name}");
                var expectedInterfaceName = $"I{repoType.Name}";

                //if (interfaceType != null)
                //{
                //    services.AddSingleton(interfaceType, repoType);
                //}
                // 在服务程序集中查找匹配的接口
                if (serviceInterfaceTypes.TryGetValue(expectedInterfaceName, out var interfaceType))
                {
                    // 确保实现类确实实现了该接口
                    if (interfaceType.IsAssignableFrom(repoType))
                    {
                        services.AddScoped(interfaceType, repoType);
                    }
                    else
                    {
                        // 处理不匹配的情况(记录日志或抛出异常)
                        throw new InvalidOperationException(
                            $"Repository {repoType.FullName} does not implement expected interface {interfaceType.FullName}");
                    }
                }
                else
                {
                    // 处理接口未找到的情况
                    throw new TypeLoadException(
                        $"Could not find interface {expectedInterfaceName} in assembly {serviceAssembly.FullName}");
                }
            }

            var serviceTypes = serviceAssembly.GetTypes()
                .Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith("Services"))
                .ToList();

            foreach (var serviceType in serviceTypes)
            {
                var interfaceType = serviceType.GetInterfaces()
                    .FirstOrDefault(i => i.Name == $"I{serviceType.Name}");

                if (interfaceType != null)
                {
                    services.AddScoped(interfaceType, serviceType);
                }
            }
        }

 

3.使用Autofac批量注册

//MedicTechRep类库和MedicTechServer的API
//Program.cs
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
var assemblysServices = Assembly.Load("MedicTechRep"); containerBuilder.RegisterAssemblyTypes(assemblysServices) .AsImplementedInterfaces()// 将类型注册为它实现的所有接口。 .InstancePerLifetimeScope()//.InstancePerLifetimeScope() .EnableInterfaceInterceptors();//启用接口拦截器,用于 AOP(面向切面编程)
//注册第二个类库(这个类库不适用接口,直接用服务类  AsImplementedInterfaces  EnableInterfaceInterceptors)
  var path2 = Path.Combine(basePath, "MedicTechRep2.dll");或者使用路径来注册
  var assemblysServices_2 = Assembly.LoadFrom(path2);
  containerBuilder.RegisterAssemblyTypes(assemblysServices)
});
//控制类(注意使用注册的服务必须使用接口,直接使用类报错)
private readonly IClass1 _class1;
public LoginRegisterController(IClass1 class1)
:base() 
{
            _class1 = class1;
}

[HttpGet("logintest")]
public async Task<ResponseBase> Getlogintest()
{
            ResponseBase res = new ResponseBase();
            res.Data = _class1.InputString();
            return res;
}

 

posted @ 2025-12-21 20:48  爱晒太阳的懒猫。。  阅读(0)  评论(0)    收藏  举报