使用相同的接口但构造函数参数不同的多个单例注册 [英] Register multiple singletons with same interface but different constructor parameters
问题描述
我有2个存储(Azure)帐户,可以将它们分别称为src和dest,并且我有需要同时访问这两个帐户的控制器,我正在尝试研究如何有条件地注册这2个单例.
I have 2 storage (Azure) accounts lets call them src and dest and I have controllers that require access to both and I'm trying to work out how to register these 2 singletons conditionally.
此 answer 给了我一些希望,但我还不太想解决,我想做的事情是这样的(赞赏的RegisterSingletonConditional不是有效的fn):
This answer gave me some hope but I can't quite work it out, what I want to do is something like (appreciate RegisterSingletonConditional isn't a valid fn):
IBlobAccessClient src = new BlobAccessClient(srcConnectionString);
IBlobAccessClient dest = new BlobAccessClient(destConnectionString);
container.RegisterSingletonConditional<IBlobAccessClient>(
src,
c => c.Consumer.Target.Parameter.Name.Contains("src"));
container.RegisterSingletonConditional<IBlobAccessClient>(
dest,
c => c.Consumer.Target.Parameter.Name.Contains("dest"));
任何指导表示赞赏.
推荐答案
有一个非通用的RegisterConditional
重载,它接受Registration
对象.您可以将BlobAccessClient
实例包装在Registration
中,然后将其传递给RegisterConditional
,如下所示:
There is a non-generic RegisterConditional
overload that accepts a Registration
object. You can wrap your BlobAccessClient
instance in a Registration
and pass it on to RegisterConditional
as shown here:
container.RegisterConditional(typeof(IBlobAccessClient),
Lifestyle.Singleton.CreateRegistration(
() => new BlobAccessClient(srcConnectionString), container),
c => c.Consumer.Target.Parameter.Name.Contains("src"));
container.RegisterConditional(typeof(IBlobAccessClient),
Lifestyle.Singleton.CreateRegistration(
() => new BlobAccessClient(destConnectionString), container),
c => c.Consumer.Target.Parameter.Name.Contains("dest"));
如果这是常见模式,则可以通过定义如下的简单扩展方法来稍微简化代码:
If this is a common pattern, you can simplify your code a bit by defining a simple extension method as follows:
public static void RegisterConditionalInstance<TService>(
this Container container, TService instance, Predicate<PredicateContext> predicate)
where TService : class
{
container.RegisterConditional(typeof(TService),
Lifestyle.Singleton.CreateRegistration(() => instance, container),
predicate);
}
这使您可以将以前的配置简化为以下内容:
This allows you to reduce the previous configuration to the following:
container.RegisterConditionalInstance<IBlobAccessClient>(
new BlobAccessClient(srcConnectionString),
c => c.Consumer.Target.Parameter.Name.Contains("src"));
container.RegisterConditionalInstance<IBlobAccessClient>(
new BlobAccessClient(destConnectionString),
c => c.Consumer.Target.Parameter.Name.Contains("dest"));
(可选)您也可以通过将谓词提取为简单方法来简化谓词:
Optionally, you can simplify the predicate by extracting this to a simple method as well:
private static Predicate<PredicateContext> InjectedIntoTargetNamed(string targetName) =>
c => c.Consumer.Target.Name.Contains(targetName);
这会将注册减少到以下内容:
This reduces the registration to the following:
container.RegisterConditionalInstance<IBlobAccessClient>(
new BlobAccessClient(srcConnectionString),
InjectedIntoTargetNamed("src"));
container.RegisterConditionalInstance<IBlobAccessClient>(
new BlobAccessClient(destConnectionString),
InjectedIntoTargetNamed("dest"));
这篇关于使用相同的接口但构造函数参数不同的多个单例注册的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!