当前位置: 首页 > wzjs >正文

常州北京网站建设关键词seo报价

常州北京网站建设,关键词seo报价,两个字的广告公司名字,做网站学习🚀 .NET基于类名约定的自动依赖注入完整指南 基于类名约定的自动依赖注入可大幅减少手动注册服务的工作量,本文将通过清晰的结构、美观的排版和丰富的示例,帮助你快速掌握这一实用技术。 🌈 核心特性概览 特性说明类名约定自动…

🚀 .NET基于类名约定的自动依赖注入完整指南

基于类名约定的自动依赖注入可大幅减少手动注册服务的工作量,本文将通过清晰的结构、美观的排版和丰富的示例,帮助你快速掌握这一实用技术。

🌈 核心特性概览

特性说明
类名约定自动识别以 Service 结尾的类(不区分大小写)
接口优先匹配优先注册到 I{ClassName} 形式的接口(如 UserServiceIUserService
多生命周期支持支持 Transient/Scoped/Singleton 三种生命周期
灵活扫描控制可指定任意程序集或默认扫描调用程序集
无接口自注册自动注册未实现接口的类为自身类型

📦 完整代码实现(含所有重载)

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
using System.Reflection;/// <summary>
/// 依赖注入扩展方法集合(基于类名约定)
/// </summary>
public static class ServiceCollectionExtensions
{/// <summary>/// 自动注册以"Service"结尾的类(默认Transient生命周期)/// </summary>public static IServiceCollection AutoRegisterServices(this IServiceCollection services,Assembly assembly = null){assembly ??= Assembly.GetCallingAssembly();// 扫描规则:公共类、非抽象、非泛型、类名以Service结尾var serviceTypes = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.IsPublic &&!t.ContainsGenericParameters &&t.Name.EndsWith("Service", StringComparison.OrdinalIgnoreCase)).ToArray();// 注册服务到容器foreach (var implType in serviceTypes){var interfaces = implType.GetInterfaces();if (interfaces.Any()){// 匹配I{ClassName}接口(如UserService→IUserService)var matchingInterface = interfaces.FirstOrDefault(i => i.Name == "I" + implType.Name);if (matchingInterface != null){services.AddTransient(matchingInterface, implType);}else{// 注册到所有实现的接口foreach (var @interface in interfaces){services.AddTransient(@interface, implType);}}}else{// 无接口时注册自身services.AddTransient(implType);}}return services;}/// <summary>/// 自动注册以"Service"结尾的类(支持自定义生命周期)/// </summary>public static IServiceCollection AutoRegisterServices(this IServiceCollection services,ServiceLifetime lifetime,Assembly assembly = null){assembly ??= Assembly.GetCallingAssembly();var serviceTypes = GetServiceTypes(assembly);foreach (var implType in serviceTypes){var interfaces = implType.GetInterfaces();var descriptor = CreateServiceDescriptor(implType, interfaces, lifetime);services.Add(descriptor);}return services;}// 辅助方法:获取服务类型(提取公共逻辑)private static Type[] GetServiceTypes(Assembly assembly) =>assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.IsPublic &&!t.ContainsGenericParameters &&t.Name.EndsWith("Service", StringComparison.OrdinalIgnoreCase)).ToArray();// 辅助方法:创建服务描述符(提取公共逻辑)private static ServiceDescriptor CreateServiceDescriptor(Type implType, Type[] interfaces, ServiceLifetime lifetime){if (interfaces.Any()){var matchingInterface = interfaces.FirstOrDefault(i => i.Name == "I" + implType.Name);if (matchingInterface != null){return new ServiceDescriptor(matchingInterface, implType, lifetime);}// 返回第一个接口(避免注册多个描述符)return new ServiceDescriptor(interfaces[0], implType, lifetime);}return new ServiceDescriptor(implType, implType, lifetime);}
}

🚀 使用示例(清晰排版)

1. 在ASP.NET Core中注册(Program.cs

var builder = WebApplication.CreateBuilder(args);// 方式1:默认Transient(扫描调用程序集)
builder.Services.AutoRegisterServices();// 方式2:指定Scoped生命周期
builder.Services.AutoRegisterServices(ServiceLifetime.Scoped);// 方式3:扫描指定程序集(如业务层)
var businessAssembly = Assembly.Load("MyBusinessLayer");
builder.Services.AutoRegisterServices(ServiceLifetime.Singleton, businessAssembly);var app = builder.Build();

2. 服务类示例(符合约定的实现)

// ✅ 示例1:接口匹配型服务
public interface IUserService { string GetInfo(); }
public class UserService : IUserService 
{public string GetInfo() => "User Service Running";
}// ✅ 示例2:多接口实现服务
public interface IAuthService { void Login(); }
public interface ILogService { void WriteLog(string msg); }
public class AuthService : IAuthService, ILogService 
{public void Login() { /* 登录逻辑 */ }public void WriteLog(string msg) { /* 日志逻辑 */ }
}// ✅ 示例3:无接口自注册服务
public class DataService 
{public void ProcessData() { /* 数据处理 */ }
}// ❌ 示例4:不符合约定的类(不会被注册)
public class ServiceHelper { }        // 类名不以Service结尾
public abstract class BaseService { } // 抽象类

🔧 扩展优化方案(带emoji标记)

1. 🌐 基于类名的生命周期自动识别

private static ServiceLifetime GetLifetimeFromName(string className)
{if (className.Contains("Singleton", StringComparison.OrdinalIgnoreCase))return ServiceLifetime.Singleton;if (className.Contains("Scoped", StringComparison.OrdinalIgnoreCase))return ServiceLifetime.Scoped;return ServiceLifetime.Transient;
}

2. 📌 特性标记增强控制

[AttributeUsage(AttributeTargets.Class)]
public class AutoRegisterAttribute : Attribute 
{public ServiceLifetime Lifetime { get; set; } = ServiceLifetime.Transient;public bool IsEnabled { get; set; } = true;
}

3. ⚡ 缓存扫描结果提升性能

private static readonly object LockObj = new();
private static Type[] _cachedServiceTypes;private static Type[] GetCachedServiceTypes(Assembly assembly)
{if (_cachedServiceTypes == null){lock (LockObj){_cachedServiceTypes = assembly.GetTypes().Where(t => /* 扫描规则 */).ToArray();}}return _cachedServiceTypes;
}

📝 最佳实践指南

  1. 📦 混合注册策略

    • 核心服务(如DbContext)手动注册:
      services.AddDbContext<AppDbContext>(options => {...});
    • 业务服务自动注册:
      builder.Services.AutoRegisterServices();
  2. 🔍 精准扫描范围

    // 仅扫描当前程序集中的服务
    builder.Services.AutoRegisterServices(typeof(UserService).Assembly);
    
  3. ✅ 单元测试验证

    [Fact]
    public void Should_Resolve_Service_By_Convention()
    {var services = new ServiceCollection();services.AutoRegisterServices(typeof(IAuthService).Assembly);var provider = services.BuildServiceProvider();var service = provider.GetService<IAuthService>();Assert.NotNull(service);
    }
    
http://www.dtcms.com/wzjs/71097.html

相关文章:

  • 怎样做阿里巴巴网站的店招东莞seo优化推广
  • 国外做软件界面的设计网站qq代刷网站推广免费
  • 建站公司推荐首推万维科技青山seo排名公司
  • 可以做网络推广的网站广州推动优化防控措施落地
  • 网站维护运营个人网站该怎么打广告
  • 网站设计有限公司网络营销计划包括哪七个步骤
  • 淘宝里面的网站怎么做的百度云网盘网页版登录
  • 怎么自己建立一个网站网站优化外包多少钱
  • 做网站开发背景互联网广告公司排名前十
  • 网站建设的技术方案模板下载seo网络推广课程
  • 网站添加邮件发送怎么做泰安seo网络公司
  • wordpress教程凌风aso关键词搜索优化
  • 网站后台开发语言经典软文案例
  • 网站开发兼职合同软文网站推荐
  • 国外的购物平台有哪些南京网站seo
  • 网站开发 前端vue 后端c理发美发培训学校
  • 经典网站首页百度网址大全下载
  • 深圳福田网站建设公司哪家好如何做线上推广
  • 网站建设都用那些软件杭州网站免费制作
  • 四川省查询建设证书的网站竞价外包运营
  • 织梦网站模板怎么做公司网站推广技巧
  • 做外贸怎么看外国网站海淀区seo搜索引擎优化企业
  • 做公司网站怎么推广郑州seo哪家好
  • 做有奖竞猜网站违法吗seo难不难
  • 如何在大学网站做宣传百度电话号码查询平台
  • 哪里找做网站的谷歌广告
  • 淘宝客网站都用什么做互联网广告公司
  • 重庆传媒公司前十名seo是什么意思 seo是什么职位
  • facebook做网站推广软文代写新闻稿
  • 景区网站建设原则成都移动seo