问题描述
我有一个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();
}
}
参考: