cyclops.framework中依赖注入核心库
License
—
Deps
2
Install Size
—
Vulns
✓ 0
Published
Feb 26, 2026
$ dotnet add package TJC.Cyclops.DICyclops.DI是企服版框架中的依赖注入核心库,提供了增强型的依赖注入功能,扩展了.NET标准依赖注入容器的能力。该库不仅支持标准的依赖注入模式,还提供了基于接口的自动注册、AOP代理拦截、生命周期管理以及丰富的配置选项,使开发者能够构建更加灵活、可维护的企业级应用。
这些接口直接继承自IDependency,为依赖注入提供了清晰的生命周期标识。
可以通过以下方式安装Cyclops.DI包:
NuGet包管理器:
Install-Package TJC.Cyclops.DI
.NET CLI:
dotnet add package TJC.Cyclops.DI
在使用Cyclops.DI之前,需要在应用程序的启动类中进行配置:
using Cyclops.DI;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 自动注入所有实现了IDependency的类型(包含ITransient、IScoped、ISingleton)
services.AutoInjectAllCustomerServices();
// 其他服务注册...
}
}
// 定义服务接口
public interface IUserService
{
User GetUserById(int id);
void SaveUser(User user);
}
// 实现服务并指定生命周期
public class UserService : IUserService, IScoped
{
private readonly IDbContext _dbContext;
public UserService(IDbContext dbContext)
{
_dbContext = dbContext;
}
public User GetUserById(int id)
{
return _dbContext.Users.FirstOrDefault(u => u.Id == id);
}
public void SaveUser(User user)
{
if (user.Id == 0)
{
_dbContext.Users.Add(user);
}
else
{
_dbContext.Users.Update(user);
}
_dbContext.SaveChanges();
}
}
// 使用InjectionAttribute配置注入行为
[Injection(Order = 10, Pattern = EnumInjectionPatterns.All)]
public class ProductService : IProductService, ISingleton
{
// 服务实现...
}
// 抑制代理创建
[SuppressProxy]
public class LoggingService : ILoggingService, ITransient
{
// 服务实现...
}
// 创建自定义代理类
public class LoggingProxy : AspectDispatchProxy
{
public IServiceProvider Services { get; set; }
public object Target { get; set; }
private ILogger _logger;
private ILogger Logger => _logger ??= Services.GetRequiredService<ILogger>();
protected override object Invoke(MethodInfo targetMethod, object[] args)
{
// 方法调用前
var methodName = targetMethod.Name;
var className = Target.GetType().Name;
Logger.Info($"[{className}.{methodName}] 开始执行");
try
{
// 执行实际方法
var result = targetMethod.Invoke(Target, args);
// 方法调用后
Logger.Info($"[{className}.{methodName}] 执行完成");
return result;
}
catch (Exception ex)
{
// 异常处理
Logger.Error($"[{className}.{methodName}] 执行出错: {ex.InnerException?.Message}", ex);
throw ex.InnerException ?? ex;
}
}
}
// 在服务上指定自定义代理
[Injection(Proxy = typeof(LoggingProxy))]
public class OrderService : IOrderService, IScoped
{
// 服务实现...
}
// 手动添加调度代理
public void ConfigureServices(IServiceCollection services)
{
// 手动添加调度代理
ServiceDescriptorUtil.AddDispatchProxy(
services,
typeof(IScoped),
typeof(PaymentService),
typeof(TransactionProxy),
typeof(IPaymentService)
);
}
public void ConfigureServices(IServiceCollection services)
{
// 自动注入所有实现了IDependency的服务
services.AutoInjectAllCustomerServices();
// 其他配置...
}
public void ConfigureServices(IServiceCollection services)
{
// 手动注册服务
var injectionAttribute = new InjectionAttribute
{
Pattern = EnumInjectionPatterns.SelfWithFirstInterface,
Action = EnumInjectionActions.Add
};
ServiceDescriptorUtil.Register(
services,
typeof(IScoped),
typeof(CustomerService),
injectionAttribute,
typeof(ICustomerService)
);
}
// 服务层 - 作用域生命周期
public class UserService : IUserService, IScoped
{
private readonly IRepository _repository; // 假设也是IScoped
private readonly ICacheService _cacheService; // 假设是ISingleton
public UserService(IRepository repository, ICacheService cacheService)
{
_repository = repository;
_cacheService = cacheService;
}
public User GetUser(int id)
{
// 优先从缓存获取
var cacheKey = $"user:{id}";
var user = _cacheService.Get<User>(cacheKey);
if (user == null)
{
// 缓存未命中,从数据库获取
user = _repository.GetById<User>(id);
// 更新缓存
if (user != null)
{
_cacheService.Set(cacheKey, user, TimeSpan.FromMinutes(30));
}
}
return user;
}
}
public class SomeService
{
private readonly IServiceProvider _serviceProvider;
public SomeService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public void ProcessBatch(List<int> ids)
{
foreach (var id in ids)
{
// 为每个操作创建单独的作用域
using (var scope = _serviceProvider.CreateScope())
{
var scopedService = scope.ServiceProvider.GetRequiredService<IScopedService>();
scopedService.Process(id);
}
}
}
}
接口继承顺序:实现类在继承ITransient、IScoped或ISingleton时,应确保它们是最后继承的接口之一,以避免类型解析问题
生命周期使用建议:
代理使用注意:
依赖注入循环引用:避免服务之间形成循环依赖,这可能导致服务初始化失败
线程安全:在使用ISingleton服务时,务必确保其是线程安全的,特别是在并发环境下
作用域管理:在长生命周期的服务中使用作用域服务时,应手动创建和管理作用域
异常处理:在代理中捕获和处理异常时,注意保留原始异常信息,以便于调试
服务注册顺序:对于有依赖关系的服务,应确保先注册被依赖的服务
日志记录:在代理中添加日志时,注意控制日志级别,避免过多的日志影响性能
内存管理:长时间运行的应用程序中,注意监控单例服务的内存使用情况,避免内存泄漏
保留所有权利