使用相同的接口但构造函数参数不同的多个单例注册 - c#

我有2个存储(Azure)帐户,可以将它们分别称为src和dest,并且我有需要同时访问这两个控制器的控制器,我正在尝试研究如何有条件地注册这2个单例。

这个answer给了我一些希望,但是我不能完全解决,我想做的事情是这样的(赞赏的RegisterSingletonConditional不是有效的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,如下所示:

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"));

如果这是常见的模式,则可以通过定义如下的简单扩展方法来稍微简化代码:

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);
}

这使您可以将以前的配置简化为以下内容:

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"));

(可选)您也可以通过将谓词提取为简单方法来简化谓词:

private static Predicate<PredicateContext> InjectedIntoTargetNamed(string targetName) =>
    c => c.Consumer.Target.Name.Contains(targetName);

这将注册减少到以下内容:

container.RegisterConditionalInstance<IBlobAccessClient>(
    new BlobAccessClient(srcConnectionString),
    InjectedIntoTargetNamed("src"));

container.RegisterConditionalInstance<IBlobAccessClient>(
    new BlobAccessClient(destConnectionString),
    InjectedIntoTargetNamed("dest"));

使用javascript在客户端的列表视图中选择所有复选框 - javascript

我有一个列表视图,在标题中有一个复选框。如果标题复选框已选中/未选中,我想选择行中的所有复选框。如何在客户端实现此目标?这是ListView设计代码。<asp:ListView ID="lvTypes" runat="server" GroupPlaceholderID="groupPlaceHolde…

将值设置为无法与jQuery一起使用的隐藏字段 - javascript

我有一个使用Visual Studio 2013创建的应用程序,但是在使用jQuery向隐藏字段分配值时遇到了一些问题。首先,我要为隐藏变量分配一个值,因为我无法直接访问.cs文件中标签的文本值,因此我必须将标签的值分配给隐藏的输入字段才能访问在.cs文件中。我希望这是有道理的。这是我在.aspx文件中的隐藏输入字段: <input type=…

Ajax表单未获得结果 - javascript

我有一个带有搜索功能的主页。从主页搜索可以正常工作,但是当我尝试使用ajax表单(在url.com/search?id=biology上)再次搜索时,我被重定向到404页面,提示未找到/Search。主页上的表格:@using (Html.BeginForm("Index", "Search", new { Retur…

使用数组填充动态下拉列表 - php

我正在尝试使用多维数组在PHP中进行动态下拉列表。我的第一个选择框正确填充,但是在选择建筑物时,我需要第二个选择框来显示用于第一个选择的相应显示(大厅,休息室等)这是数组:$displays = array( "Company" => array( "Building 1"=>array( "Di…

调整窗口大小时如何调整YouTube播放器的大小 - php

我想显示包含YouTube视频的弹出窗口。我的问题是当用户调整弹出窗口的大小时如何调整YouTube播放器的大小?弹出窗口的头部分PHP / HTML代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/…