使用相同的接口但构造函数参数不同的多个单例注册 [英] Register multiple singletons with same interface but different constructor parameters

查看:102
本文介绍了使用相同的接口但构造函数参数不同的多个单例注册的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆