创建新实例,同时仍然使用依赖注入

2024-05-26

环境的快速描述:

我有一个代表聊天室并依赖于记录器的类。它与具有横切关注点的系统范围记录器不同,而是与特定聊天室绑定的记录器。它将该聊天室中的所有活动记录到其唯一的日志文件中。当聊天室创建时,我想打开日志文件,当聊天室被销毁时,我想关闭日志文件。

问题

这是我正在使用的相关代码。

public interface IChatroomLogger
{
    void Log(ServerPacket packet);
    void Open();
    void Close();
}

public class ChatroomLogger : IChatroomLogger
{
    // chatroom name will be used as a file name
    public ChatroomLogger(string chatroomName) { ... }
    public void Log(ServerPacket packet) { ... }
}

public class Chatroom
{
    public Chatroom(string name, IChatroomLogger logger)
    {
        this.name = name;
        this.logger = logger;
        this.logger.Open();
    }

    public IChatromLogger Logger { get { return this.logger; } }
}

public interface IChatManager
{
    Chatroom Get(chatroomName);
}

它在应用程序中的使用如下:

var room = ChatManager.Get(chatroomName);
romm.DoStuff();
room.Logger.LogPacket(receivedPacket);

The ChatManager是一个类,它保存对所有聊天室的引用,并负责创建和删除它们。我还没有写它,但这就是我一直在编码的接口。

问题

如何得到ChatManager创建新实例Chatroom并且仍然使用依赖注入?

我正在使用 Unity 来完成所有其他 DI 工作。到目前为止效果很好。但我不确定如何解决这个难题。

当我的具体实现ChatManager创建新的聊天室,它必须传入一个IChatroomLogger。它不知道如何构建它......但 Unity 知道。但然后我必须通过IUnityContainer进入ChatManager.

public class ChatManager : IChatManager
{
    public ChatManager(IUnityContainer container)
    {
        this.container = container;
    }

    public Chat Get(string chatroomName)
    {
        // get logger from Unity somehow. Not sure how I'd 
        // pass chatroomName to the concrete instance
        var logger = ...
        return new Chatroom(chatroomName, logger);
    }
}

出于某种原因,这似乎是错误的。让域不知道我正在使用的 DI 容器似乎更干净。

我怎样才能获得新的类实例Chatroom当我的应用程序在运行过程中没有诉诸某种服务定位器设计时?是我想太多了吗?传递一下Unity不是没什么大不了的吗?欢迎任何想法!


你说得对。像这样使用IUnityContainer就不再使用依赖注入了。相反,它使用“服务定位器”模式。在这种情况下我通常做的是创建一个IFactory<T>界面,像这样:

public IFactory<T>
{
    T Get();
}

然后用一个类实现该接口does了解并使用IUnityContainer。设置您的绑定,以便IFactory<>requests 将创建该工厂类的一个实例。这样,您就可以注入IFactory<Logger>接口进入你的ChatManager,并致电.Get()任何时候你想要一个记录器实例。

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

创建新实例,同时仍然使用依赖注入 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 分解大于 100 位的整数 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 X and Y是大于 100 位的整数 求整数P其在范围 X Y 并且保证了 最佳 素数分解 即具有最多的分解 unique主要原因 我所
  • 我可以指定默认的 AWS 配置文件吗?

    在我的开发环境中 我经常在多个 AWS 访问密钥之间切换 所以在我的 aws credentials文件 我有几个配置文件 然后 我可以通过指定以下内容将这些配置文件与 aws cli 一起使用 profile
  • XAMPP:作曲家返回错误而不是创建新的 laravel 项目

    使用ubuntu 16 04 LTS 在两个不同版本的地方安装了PHP 在root 7 0和XAMPP 5 6中 composer全局安装 现在我无法从lamp htdocs创建composer项目 xampp运行良好 作曲家已安装并运行良
  • 越狱的 iOS 从后台应用程序截图

    我正在为自己构建一个实用程序应用程序 当该实用程序在后台运行时 它可以截取前台运行的任何内容的屏幕截图 该实用程序将在越狱设备上运行 因此它可以访问私有 API 而不受沙箱的限制 由于实用程序应用程序在后台运行 作为守护程序或使用后台程序
  • 传递到字典中的模型项的类型为“Sitecore.Mvc.Presentation.RenderingModel”,但此字典需要类型为“X”的模型项

    我正在使用 Sitecore 7 和 ASP NET MVC 3 构建解决方案 并尝试使用自定义模型类 如中所述约翰 韦斯特的这篇博文 http www sitecore net france Community Technical Blo
  • @Nullable 和 SonarQube “有条件执行的块应该可达”警告

    包有以下package info java ParametersAreNonnullByDefault package foo import javax annotation ParametersAreNonnullByDefault 类有
  • Typescript 类似断言的类型保护

    这是否可以在没有限制的情况下限制类型if通过函数调用never返回例如undefined like assert在打字稿中 示例代码 interface Foo bar void function getFoo Foo undefined
  • 带有存储在文件中的通配符的 grep

    我希望 grep 通过读取需要从文本文件中过滤掉的内容来过滤掉行 这是我给 grep 的内容 它存储在foo txt Users 1337 X Users 1337 R Users 1337 W 这是它应该过滤的内容 它存储在bar txt
  • 包含 ListView 更新、CellValueFactory 的 JavaFX TableView

    我确实有一个引擎 其中包含以下列表中的部件 UPDATE 我更新了文本以提供示例 我想要一个包含 2 列 名称 零件 的引擎 TableView 我希望将 Column 部分呈现为 TableCell 中的 ListView 因此我重写了该
  • 在 CGridView 中显示另一个模型的属性

    在 Yii 中 我正在做多模型 我的数据库是这样的 Group id name Member id group id firstname lastname membersince 在组控制器中 我想显示成员的属性 一切工作正常 但是当我使用
  • Zuul不转发请求到其他微服务

    我正在使用 Spring Boot 微服务 我已经配置了 eureka zuul 代理和另一个微服务 帐户 如果我直接从帐户拨打电话 则工作正常 帐户和 zuul 服务器都显示在 eureka 上 当我尝试使用 zuul 代理进行访问时 它
  • CTRL + 单击 Sublime Text 2 中的绑定

    我多年来使用 IDE 的一个长期习惯是 CTRL 或命令 单击选择一个完整的单词 这相当于双击当前 ST2 中的单词 我希望能够在ST2中恢复这个能力 我会用按键绑定还是插件来解决这个问题 如果您创建一个sublime text 2 Pac
  • 如何用 C# 发送原始以太网数据包? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有办法通过 C 将原始数据包以太网发送到其他主机 在 Windows 7 中 如果有区别的话 根据 Saint pl 的建议 我找
  • 在浏览器中下载视频,而不是在新选项卡中播放 [CORS]

    I have a 并在其内部href属性 当我点击该属性时 我从第 3 方 api 获得了一个视频 URL a 浏览器打开一个新选项卡并播放视频而不是下载视频 PROBLEM 我需要实现的是点击后直接下载视频 a 而不是在新标签中播放并强制
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • c#.net MS Access 数据库,未安装 Access [重复]

    这个问题在这里已经有答案了 是否可以 我尝试过谷歌 但我一定是搜索了错误的关键词并且没有得到答案 我有一个仅由 2 3 人使用的小型应用程序 我想将其数据存储在数据库中 我无法安装任何 SQL 服务器 因此我认为访问将是最好的选择 将使用它
  • numba.prange 性能不佳

    我试图整理一个简单的例子来说明使用的好处numba prange对于我自己和一些同事来说 但我无法获得像样的加速 我编写了一个简单的一维扩散求解器 它本质上是在一个长数组上循环 组合元素i 1 i and i 1 并将结果写入element
  • IntelliJ Git 集成 - git --version 空输出

    我目前正在尝试使用 IntelliJ 2016 2 的 Git 集成 但每当我将其指向可执行文件时 我都会遇到以下问题 这在技术上并不会阻止集成工作 但它确实会导致更新索引等问题 我正在运行 Windows 7 完全全新安装 但我在以前的
  • 将图像添加到从 altchunk 创建的 openxml 文档中

    我需要一个从 xhtml 源创建 docx 文件的自动化过程 xhtml 文件包含图像 img 元素 其 src 属性指向外部引用 但是docx文件需要在没有网络连接的情况下可读 所以我需要找到一种方法将图像直接嵌入到docx包中 即在 m
  • 创建新实例,同时仍然使用依赖注入

    环境的快速描述 我有一个代表聊天室并依赖于记录器的类 它与具有横切关注点的系统范围记录器不同 而是与特定聊天室绑定的记录器 它将该聊天室中的所有活动记录到其唯一的日志文件中 当聊天室创建时 我想打开日志文件 当聊天室被销毁时 我想关闭日志文