使用 Unity 解决命名依赖关系

2023-11-27

我有一个具有 2 个依赖项的服务:一个存储库和一个网关(短信)。

我需要解析该服务的 2 个不同版本,它们仅在传递给网关的参数之一上有所不同。

代码简化如下

public interface IService
{
    string DoSomething();
}

public interface IServiceFoo
{
    string DoSomething();
}

public interface IServiceBar
{
    string DoSomething();
}

public interface IRepository { }
public class Repository : IRepository { }

public interface IGateway
{
    string Name { get; set; }
}

public class Gateway : IGateway
{
    public string Name { get; set; }
    public Gateway(string name)
    {
        this.Name = name;
    }
}

public class Service : IService, IServiceFoo, IServiceBar
{
    private readonly IGateway _gateway;
    private readonly IRepository _repo;
    public Service(IRepository repo, IGateway gateway)
    {
        _gateway = gateway;
        _repo = repo;
    }

    public string DoSomething()
    {
        return _gateway.Name;
    }
}

测试失败

[TestClass]
public class UnityTest
{
    [TestMethod]
    public void TestMethod1()
    {
        var container = new UnityContainer();
        container
            .RegisterType<IRepository, Repository>()
            .RegisterType<IGateway, Gateway>("FooGateway", new InjectionConstructor("I am foo"))
            .RegisterType<IGateway, Gateway>("BarGateway", new InjectionConstructor("I am bar"))
            .RegisterType<IServiceFoo, Service>(new InjectionConstructor(new ResolvedParameter<IRepository>(), new ResolvedParameter<IGateway>("FooGateway")))
            .RegisterType<IServiceBar, Service>(new InjectionConstructor(new ResolvedParameter<IRepository>(), new ResolvedParameter<IGateway>("BarGateway")));

        var barGateway = container.Resolve<IGateway>("BarGateway");
        var fooGateway = container.Resolve<IGateway>("FooGateway");

        var serviceBar = container.Resolve<IServiceBar>();
        var serviceBarGatewayName = serviceBar.DoSomething();

        var serviceFoo = container.Resolve<IServiceFoo>();
        var serviceFooGatewayName = serviceFoo.DoSomething();

        Assert.AreEqual("I am bar", barGateway.Name); // pass
        Assert.AreEqual("I am foo", fooGateway.Name); // pass


        Assert.AreEqual("I am bar", serviceBarGatewayName); // pass
        Assert.AreEqual("I am foo", serviceFooGatewayName); // FAIL

解析服务时传入了错误的网关,但是如果我通过名称显式解析网关,则结果是正确的。我认为我缺少 ResolvedParameter(string name) 工作原理的一些基本知识,但我假设它会在容器中查找具有该名称的类型。


仍然不知道为什么你的版本不起作用,但这确实有效(正如我所期望的):

        var container = new UnityContainer();
        container
            .RegisterType<IRepository, Repository>()
            .RegisterType<IGateway, Gateway>( "FooGateway", new InjectionConstructor( "I am foo" ) )
            .RegisterType<IGateway, Gateway>( "BarGateway", new InjectionConstructor( "I am bar" ) )
            //.RegisterType<IServiceFoo, Service>( new InjectionConstructor( new ResolvedParameter<IRepository>(), new ResolvedParameter<IGateway>( "FooGateway" ) ) )
            //.RegisterType<IServiceBar, Service>( new InjectionConstructor( new ResolvedParameter<IRepository>(), new ResolvedParameter<IGateway>( "BarGateway" ) ) );
            .RegisterType<IServiceFoo>( new InjectionFactory( c => new Service( c.Resolve<IRepository>(), c.Resolve<IGateway>( "FooGateway" ) ) ) )
            .RegisterType<IServiceBar>( new InjectionFactory( c => new Service( c.Resolve<IRepository>(), c.Resolve<IGateway>( "BarGateway" ) ) ) );

请注意,我正在使用InjectionFactory代替InjectionConstructor.

还有另一个有效的版本。这次我保留了您注册服务的方式,但我让它们命名并按名称解析:

        var container = new UnityContainer();
        container
            .RegisterType<IRepository, Repository>()
            .RegisterType<IGateway, Gateway>( "FooGateway", new InjectionConstructor( "I am foo" ) )
            .RegisterType<IGateway, Gateway>( "BarGateway", new InjectionConstructor( "I am bar" ) )
            .RegisterType<IServiceFoo, Service>( "sf", new InjectionConstructor( new ResolvedParameter<IRepository>(), new ResolvedParameter<IGateway>( "FooGateway" ) ) )
            .RegisterType<IServiceBar, Service>( "sb", new InjectionConstructor( new ResolvedParameter<IRepository>(), new ResolvedParameter<IGateway>( "BarGateway" ) ) );
            //.RegisterType<IServiceFoo>( new InjectionFactory( c => new Service( c.Resolve<IRepository>(), c.Resolve<IGateway>( "FooGateway" ) ) ) )
            //.RegisterType<IServiceBar>( new InjectionFactory( c => new Service( c.Resolve<IRepository>(), c.Resolve<IGateway>( "BarGateway" ) ) ) );


        var barGateway = container.Resolve<IGateway>( "BarGateway" );
        var fooGateway = container.Resolve<IGateway>( "FooGateway" );

        var serviceBar = container.Resolve<IServiceBar>( "sb" );
        var serviceBarGatewayName = serviceBar.DoSomething();

        var serviceFoo = container.Resolve<IServiceFoo>( "sf" );
        var serviceFooGatewayName = serviceFoo.DoSomething();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Unity 解决命名依赖关系 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 在 Python 中使用多处理和请求并行发布请求

    我有小代码片段如下 import requests import multiprocessing header X Location UNKNOWN X AppVersion 2 20 0 X UniqueId 2397123 X User
  • 如何确定数据点的两个分区(聚类)是否相同?

    I have n某个任意空间中的数据点 我将它们聚类 我的聚类算法的结果是一个由 int 向量表示的分区l长度n将每个点分配给一个簇 的价值观l范围从 0 到 可能 n 1 Example l 1 1 1 1 0 0 2 6 是一个分区n
  • 如何改变设计以使实体不使用注入?

    我读过并开始意识到 带有注入的实体 数据对象 用于 JPA 或序列化 是一个坏主意 这是我当前的设计 所有适当的字段都有 getter 和 setter 并且serialVersionUID为了简洁起见 我放弃了 这是父对象 是实体组合图的
  • Delphi中如何实现并行循环?

    如何在Delphi Delphi 200X Delphi XE 中实现并行循环 如何最好地做到这一点 有没有通用的解决方案 请举例说明 目前最好的解决方案可能是 Parallel For Loop 构造全线程库 您向它传递一个集合或一对表示
  • 使用 TSC(时间戳计数器)进行时间计算

    我正在尝试通过 Linux 内核模块以非常高的精度测量 Linux 内核中某些代码所花费的时间 为了这个目的 我曾尝试过rdtscl 它给出了代码中使用的时钟滴答数 如下所示 unsigned long ini end rdtscl ini
  • 如何在 Angular 4 中对齐左右文本 mat-card-header?

    我需要将标题中的文本内容对齐标题标记的左侧和右侧 我尝试了不同的想法 但没有一个适合我 帮我 div style width 40 div
  • 量角器切换到上一个选项卡

    打开新选项卡 第二个 后 我尝试切换到第一个选项卡 common clickOpenNewSession it opens the new tab browser getAllWindowHandles then function hand
  • 在 Java ME 中将 JSON 字符串转换为对象?

    Java J2ME中有没有办法转换字符串 例如 name MyNode width 200 height 100 在一行代码中转换为相同的内部对象表示 因为目前的方法太繁琐了 Object n create new setString p
  • Clojure Web 应用程序的良好 Web 服务器/Servlet 容器?

    我正在为我的 compojure Web 应用程序寻找一个好的生产 Web 服务器 servlet 容器 对于使用 compojure 的 Clojure Web 应用程序 使用 Jetty 或 Tomcat 或其他服务器有何优缺点 有没有
  • IIS ASP.Net 网站 - ManagedPipelineHandler 错误(尝试在不存在的网络连接上执行操作)

    我遇到一个奇怪的问题 我有一个使用表单身份验证的 ASP Net Web 应用程序 如果我打开登录页面并且有几分钟处于非活动状态 则登录尝试超时或 IE FireFox 显示 无法显示此页面 如果没有暂停或缺乏活动 则没有问题并且网站按预期
  • 如何在 LLVM 中打印字符串

    我想将 LLVM 中的指令打印到字符串而不是屏幕上 我用I gt print errs 打印到屏幕上 我怎样才能将指令放入字符串中 像这样 std string str llvm raw string ostream rso str I g
  • 如何停止Memo控件的自动滚动?

    在 Windows 7 中 备忘录控件 TMemo 插入文本后会自动滚动 Memo Lines Add Path 这是我不想要的 因为滚动是我自己完成的 如何停止自动滚动 通常 向备忘录控件添加文本会将备忘录滚动到插入文本的底部 为了防止这
  • Objective-C 接口、委托和协议

    因此 我试图了解 Objective C 接口 委托和协议 所以我有一个问题 委托是否必须位于单独的文件中 或者可以是类中定义的方法吗 协议类似于java接口吗 这就是我目前的理解方式 如果你使用这个协议 它基本上会让你实现方法 我仍然对接
  • 外键与辅助键

    我曾经认为外键和辅助键是同一个东西 谷歌搜索后 结果更加令人困惑 有些人认为它们是相同的 另一些人则说辅助键是一个不必是唯一的索引 并且允许比主键更快地访问数据 有人可以解释其中的区别吗 或者这确实是一个混合术语的情况 每个数据库类型可能有
  • Math.Round 与 String.Format

    我需要将双精度值四舍五入为 2 位数字 什么是更好的 String Format 0 0 00 123 4567 123 46 Math Round 123 4567 2 123 46 Math Round double digits 数字
  • 改善 Flexbox 生产线的平衡

    举例来说 假设我有一个弹性盒 其中每个元素都包含一个图像 在这种情况下 Flexbox 的目的是均匀分布它们 看起来很容易 我们来试试吧 flex width 350px display flex flex wrap wrap flex g
  • javascript:检测滚动结束

    我有一个div层与overflow set to scroll 当滚动到底部时div 我想运行一个函数 接受的答案从根本上来说是有缺陷的 现已被删除 正确答案是 function scrolled e if myDiv offsetHeig
  • 使用动态字段名称更新模型实例

    我想做的很简单 f Foobar objects get id 1 foo somefield bar somevalue f foo bar f save 这不起作用 因为它尝试更新 f 对象的 foo 字段 该字段当然不存在 我怎样才能
  • 创建 MySQL 触发器的 SQL 语法错误

    我尝试创建触发器 CREATE TRIGGER aster users2 after update ON aster users FOR EACH ROW BEGIN update event set flag 1 where id 1 E
  • 使用 Unity 解决命名依赖关系

    我有一个具有 2 个依赖项的服务 一个存储库和一个网关 短信 我需要解析该服务的 2 个不同版本 它们仅在传递给网关的参数之一上有所不同 代码简化如下 public interface IService string DoSomething