c# - 如何使用 IocManager 为 Aspnet 样板中的不同构造函数参数集注册类的单例
问题描述
我有一个 Aspnet 样板 C# Web 应用程序,在PreInitialize()
一个模块的方法中我有这个依赖注册
IocManager.Register<IMyProvider, MyConcreteProvider>(DependencyLifeStyle.Transient);
该类MyConcreteProvider
有一个构造函数,我在解析IMyProvider
接口时使用它来传递一个参数。我需要这样做,因为MyConcreteProvider
更改的行为取决于传递的参数值。
using (var providerDisposable = IocResolver.ResolveAsDisposable<IMyProvider>(providerInstance, new
{
param = "Test"
}))
{
// Use providerInstance
}
它工作得很好,但是在IMyProvider
接口的每次实例化时,MyConcreteProvider
都会重新创建类。我想要的是一个MyConcreteProvider
基于param
参数值的 Singleton,所以如果我实例化两次MyConcreteProvider
类,将两次相同的值“Test”传递给param
参数,它只会被实例化一次。
所以问题是,如何IocManager
为不同的构造函数参数值注册一个类的单例?
解决方案
实现基于param
.
public override void PreInitialize()
{
base.PreInitialize();
IocManager.IocContainer.Register(
Component.For<IMyProvider>().ImplementedBy<MyConcreteProvider>()
.LifestyleScoped<MyProviderScopeAccessor>()
);
}
public class MyProviderScopeAccessor : IScopeAccessor
{
private static readonly ConcurrentDictionary<string, ILifetimeScope> collection = new ConcurrentDictionary<string, ILifetimeScope>();
public ILifetimeScope GetScope(CreationContext context)
{
var param = (string)context.AdditionalArguments["param"];
return collection.GetOrAdd(param, new DefaultLifetimeScope());
}
public void Dispose()
{
foreach (var scope in collection)
{
scope.Value.Dispose();
}
collection.Clear();
}
}
参考:
推荐阅读
- ios - 如何使用 BLE+BT 通过 iPhone 上的其他蓝牙设备阅读和回复任何通知(任何应用程序通知)
- apache-spark - Spark DataFrame 中是否有 aggregateByKey 函数?
- html - 如何在 Bootsrap4 中的列之间添加边距?
- python - 在 Docker 容器中设置 Flask Session 的权限
- python - Python 使用内部 CA 请求 SSLError
- c# - 如何在列表项的 ASP.NET MVC 计算字段中获取文本而不是值?
- sql - 对数据集进行高级查询并在每次将新数据添加到集合时自动返回相关更新结果的服务?
- python - 如何更新 django 中的查询集值?
- r - 如何从R中的数据集中选择多个模式
- cordova - 为什么我的景观资源不是由 ionic cordova referesh 生成的?