在ASP.NET Core中实现自动注入、批量注入

本文介绍了一种自动依赖注入的方法,通过定义通用接口和扩展方法,自动扫描项目中的所有程序集,注册实现了特定接口的类,简化了依赖注入的维护工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在使用AddScoped、AddTransient、AddSingleton这类方法的时候很是麻烦。我们每增加一个接口以及其实现的时候,是不是需要在这里硬编码注册一行代码呢?项目小还好,但当我们的项目变得庞大之后,这里的依赖注入怎么来维护呢?
在网上翻了半天,看了很多方法,其代码的实现个人感觉都不是太优雅,想想还是自己写一个比较实用吧,我们只需按照一个规定来定义和实现接口。应用程序就能自动扫描并注册这些程序集中的接口和对应实现类,完成依赖注入的自动注册,具体的实现可以通过接口或特性来实现,如果需要区分AddScoped、AddTransient、AddSingleton可以通过定义不同的接口去实现,这里我们定义IDenpendency接口做演示,具体实现如下: 

第一步:创建如下这样一个空接口

public interface IDenpendency { }

第二步:创建需要注入的功能接口,这类接口就是你想实现某些功能的封装,它们都继承第一步创建的接口IDenpendency,如下,我创建一个功能接口

public interface IUserService:IDenpendency
{
  //function
}

第三步:实现需要注入的功能接口,如下,我创建了一个实现UserService的类

public class UserService:IUserService 
{
  //function的具体实现
}

 第四步:扩展IServiceCollection批量注入方法AddDataService

    public static class DataServiceExtension
    {
        /// <summary>
        /// 注入数据
        /// </summary>
        /// <param name="services"></param>
        public static IServiceCollection AddDataService(this IServiceCollection services)
        {
            #region 依赖注入
            //services.AddScoped<IUserService, UserService>();
            var baseType = typeof(IDependency);
            var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
            var referencedAssemblies = System.IO.Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToArray();
            var types = referencedAssemblies
                .SelectMany(a => a.DefinedTypes)
                .Select(type => type.AsType())
                .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
            var implementTypes = types.Where(x => x.IsClass).ToArray();
            var interfaceTypes = types.Where(x => x.IsInterface).ToArray();
            foreach (var implementType in implementTypes)
            {
                var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType));
                if (interfaceType != null)
                    services.AddScoped(interfaceType, implementType);
            }
            
            #endregion

            return services;
        }
    }
View Code

第五步:在Startup.cs调用AddDataService方法进行批量注入

 

 

 

 本人原创文章,非商业用途可随意转载,转载请保留原文出处 

转载于:https://www.cnblogs.com/hjpms/p/11108915.html

ASP.NET Core实现高效批量图片上传的功能,你可以按照以下步骤操作: 1. **文件上传配置**: - 首先,在项目中启用`Microsoft.AspNetCore.Http.FormFileModule`模块,以便支持文件上传。在Startup.cs中添加相关依赖注入。 ```csharp public void ConfigureServices(IServiceCollection services) { //... services.AddHttpClient<FileUploadClient>(); services.AddControllersWithViews(); services.AddMultipartSupport(); } ``` 2. **创建控制器动作**: 创建一个POST方法,接收`IFormFile`类型的多个文件作为参数,例如`IList<IFormFile> files`。 ```csharp [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> UploadImages(IList<IFormFile> files) { if (files == null || files.Count == 0) { return BadRequest("No file(s) selected."); } //...后续处理图片上传 } ``` 3. **处理文件上传**: 使用`System.IO`和`Azure.Storage.Blobs`(如果要存到云存储)等库来读取、验证和保存文件。对每个文件做独立处理,可以避免单点故障,并提高并发性能。 ```csharp foreach (var file in files) { try { var fileName = $"{Guid.NewGuid()}.{file.FileName.Split('.')[1]}"; string filePath = Path.Combine(_mediaRootPath, fileName); using (var stream = await file.OpenReadStreamAsync()) { await File.WriteAllBytesAsync(filePath, await stream.ReadAsByteArrayAsync()); // 如果需要上传到云存储,替换filePath为相应的操作 } } catch (Exception ex) { // 捕获并记录错误 Console.WriteLine($"Error uploading file {file.FileName}: {ex.Message}"); } } ``` 4. **返回响应**: 上传完成后,可以选择返回一个成功的状态码和反馈消息给前端,或者跳转到另一个页面显示上传结果。 5. **安全性考虑**: - 对上传的文件内容进行检查,防止恶意文件或过大文件造成服务器压力。 - 实现文件名唯一化,避免覆盖已有文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值