如何在Aspnet样板中为不同的构造函数参数集向IocManager注册类的Singleton



我有一个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类。我想要的是基于param参数值的MyConcreteProvider的Singleton,这样,如果我实例化两次MyConcreteProvider类,两次都传递相同的值";测试";对于param参数,它只被实例化一次。

所以问题是,如何用IocManager为不同的构造函数参数值注册类的Singleton?

实现基于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();
}
}

参考文献:

  1. https://riptutorial.com/castle-windsor/example/25168/custom-lifestyle---iscopeaccessor
  2. https://github.com/castleproject/Windsor/blob/master/docs/implementing-custom-scope.md

相关内容

最新更新