当前位置:网站首页>7.依赖注入
7.依赖注入
2022-07-25 16:32:00 【InfoQ】
按照约定的注册
依赖接口
- ISingletonDependency: 注册生命周期为Singleton的服务
- IScopedDependency: 注册生命周期为Scoped的服务
- ITransientDependency: 注册生命周期为Transient的服务
- IAutoFireDependency: 自动触发(与ISingletonDependency、IScopedDependency、ITransientDependency结合使用,在服务自动注册结束后触发一次获取服务操作,仅继承IAutoFireDependency不起作用)
public class StorageOptions : ITransientDependency
{
}
特性
IgnoreInjection
- Cascade: 设置为true时,当前类以及子类都不再被自动注册,设置为false,仅当前类不被自动注册(默认false)
public class BaseService : ISingletonDependency
{
public static int Count { get; set; } = 0;
public BaseService()
{
Count++;
}
public BaseService(bool isChildren)
{
}
}
[IgnoreInjection]
public class GoodsBaseService : BaseService
{
public GoodsBaseService() : base(true)
{
}
}
public class GoodsService : GoodsBaseService
{
public static int GoodsCount { get; set; } = 0;
public GoodsService()
{
GoodsCount++;
}
}
BaseServiceGoodsServiceDependency
- TryRegister: 设置true则仅当服务未注册时才会被注册,类似IServiceCollection的TryAdd ... 扩展方法.
public interface ICache : ISingletonDependency
{
void Set(string key, string value);
}
[Dependency(TryRegister = true)]
public class EmptyCache : ICache
{
public void Set(string key, string value)
{
throw new NotSupportedException($"暂不支持{nameof(Set)}方法");
}
}
public class MemoryCache : ICache
{
private readonly ConcurrentDictionary<string, Lazy<string>> _dicCache = new();
public void Set(string key, string value)
{
_ = _dicCache.AddOrUpdate
(
key,
k => new Lazy<string>(() => value, LazyThreadSafetyMode.ExecutionAndPublication),
(_, _) => new Lazy<string>(() => value, LazyThreadSafetyMode.ExecutionAndPublication)
).Value;
}
}
ICacheMemoryCache- ReplaceServices: 设置true则替换之前已经注册过的服务,类似IServiceCollection的Replace ... 扩展方法.
public interface IEncryptionService : ISingletonDependency
{
string MethodName { get; }
}
[Dependency(ReplaceServices = true)]
public class Sha1EncryptionService : IEncryptionService
{
public string MethodName => "Sha1";
}
public class Md5EncryptionService : IEncryptionService
{
public string MethodName => "Md5";
}
IEncryptionServiceSha1EncryptionService快速入门
- 安装.Net 6.0
- 新建单元测试项目
Assignment.DependencyInjection,选择MSTest,并安装Masa.Utils.Extensions.DependencyInjection
dotnet new xunit -o Assignment.DependencyInjection
cd Assignment.DependencyInjection
dotnet add package Masa.Utils.Extensions.DependencyInjection --version 0.5.0-preview.2
- 新建类
StorageOptions
public class StorageOptions : ITransientDependency
{
}
- 新建类
DITest
[TestClass]
public class DITest
{
private IServiceCollection _services;
[TestInitialize]
public void Init()
{
_services = new ServiceCollection();
_services.AddAutoInject();//执行自动注入
}
[TestMethod]
public void TestAutoInject()
{
Assert.IsTrue(_services.Any<StorageOptions>(ServiceLifetime.Transient));//判断StorageOptions注册成功,且生命周期为Transient
}
private IServiceProvider ServiceProvider => _services.BuildServiceProvider();
}
总结
- 根据业务需要,则指定类或接口中实现以下接口
ISingletonDependency单例(项目启动后仅初始化一次)
IScopedDependency请求 (每次请求仅初始化一次)
ITransientDependency瞬时(每次获取都会被初始化)
- 抽象类不会被自动注册
- 如果你有一个自定义接口
IRepository,且希望接口以及对应的默认实现类RepositoryBase会被自动注册生命周期为Scoped,则接口IRepository应该继承IScopedDependency
- 如果你希望默认提供的
RepositoryBase可以被用户定义的类替换,则应该在RepositoryBase上方增加[Dependency(TryRegister = true)],那用户仅需要实现IRepository即可
- 或不更改默认提供的
RepositoryBase,用户实现IRepository后,并在新的实现类上方增加[Dependency(ReplaceServices = true)]
本章源码
开源地址

边栏推荐
- 【ZeloEngine】反射系统填坑小结
- easyui修改以及datagrid dialog form控件使用
- 复旦大学EMBA同学同行专题:始终将消费者的价值放在最重要的位置
- slf4j 搭配 log4j2 处理日志
- MySQL pessimistic lock
- 用递归进行数组求和
- C# 音乐
- 聊聊如何用 Redis 实现分布式锁?
- [image denoising] image denoising based on bicube interpolation and sparse representation matlab source code
- Baidu rich text editor ueeditor single image upload cross domain
猜你喜欢

Solve win10 disk occupation of 100%

MyBaits

Upgrade esxi6.7.0 to 7.0u3f (updated on July 12, 2022)

Win11桌面切换快捷键是什么?Win11快速切换桌面的方法

152. 乘积最大子数组

Waterfall flow layout

Who moved my memory and revealed the secret of 90% reduction in oom crash

easyui修改以及datagrid dialog form控件使用

EMQX Cloud 更新:日志分析增加更多参数,监控运维更省心

复旦大学EMBA同学同行专题:始终将消费者的价值放在最重要的位置
随机推荐
MySQL implicit lock
谁动了我的内存,揭秘 OOM 崩溃下降 90% 的秘密
easyui datagrid控件使用
【云驻共创】探秘GaussDB如何助力工商银行打造金融核心数据
Simple rotation map and hamster beating
Win11自带画图软件怎么显示标尺?
C# 模拟抽奖
152. Product maximum subarray
pymongo保存dataframe格式的数据(insert_one, insert_many, 多线程保存)
easyui下拉框,增加以及商品的上架,下架
3D 语义分割——Scribble-Supervised LiDAR Semantic Segmentation
3D语义分割——PVD
Baidu rich text editor ueeditor single image upload cross domain
Use huggingface to quickly load pre training models and datasets in moment pool cloud
High score technical document sharing of ink Sky Wheel - Database Security (48 in total)
2D 语义分割——DeepLabV3plus 复现
doGet与doPost
聊聊如何用 Redis 实现分布式锁?
MySQL intent lock
[fault diagnosis] bearing fault diagnosis based on Bayesian optimization support vector machine with matlab code