.NET Core 依赖注入
.NET Core 依赖注入
关于IOC和依赖注入
IOC(控制反转)IOC是一种设计思想,类似于描述创建这个对象的方式,IOC框架(Unity、Autofac、Spring.NET,...),控制反转主要控制了对象本身的创建、实例化以及依赖关系,不需要去主动创建,在需要的时候等待容器注入所需的资源,使得项目体系更加松散,降低了耦合,(从主动创建到被动获取,IOC给予)
- 基于反射 &.NET Core 自带IOC容器实现
public static class GlobalData
{
public static readonly List<Assembly> AllAssemblies;
public static readonly List<Type> AllTypes;
static GlobalData()
{
string projectName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
AllAssemblies = (from x in Directory.GetFiles(projectName, "*.dll")
where new FileInfo(x).Name.Contains("程序集前缀")
select Assembly.LoadFrom(x) into x
where !x.IsDynamic
select x).ToList();
AllAssemblies.ForEach(delegate (Assembly aAssembly)
{
AllTypes.AddRange(aAssembly.GetTypes());
});
}
}
//自定义声明周期特性,不指定情况下默认为Transient
public static class ServiceAttribute : Attribute
{
public ServiceLifetime Lifetime { get; set; }
public ServiceAttribute(ServiceLifetime serviceLifetime = ServiceLifetime.Transient) => Lifetime = serviceLifetime;
}
//在ConfigureServices中添加当前方法就能通过自定义特性的方式实现依赖注入 services.AddService()
public static void AddService(this IServiceCollection services)
{
var types = GlobalData.AllTypes
.Where(o => o.IsClass && !o.IsAbstract && o.GetCustomAttributes(typeof(ServiceAttribute), false).Length > 0).ToList();
types.ForEach(item =>
{
var lifecycleType = item.GetCustomAttribute<ServiceAttribute>().Lifetime;
item.GetInterfaces().ToList().ForEach(o =>
{
if (lifecycleType is ServiceLifetime.Scoped)
services.AddScoped(o, item);
if (lifecycleType is ServiceLifetime.Singleton)
services.AddSingleton(o, item);
if (lifecycleType is ServiceLifetime.Transient)
services.AddTransient(o, item);
});
});
}
[Service]
//[Service(ServiceLifetime.Scoped)]
//[Service(ServiceLifetime.Singleton)]
public class Base_UserBusiness : IBase_UserBusiness
{
//业务逻辑...
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端