编写一个“启用”依赖注入的库

2024-02-27

我目前正在开发一个项目,它将主要基于图书馆。

我希望使用依赖项注入来使用该库,但我希望该库在很大程度上与所使用的容器无关。

我不久前写了一个“桥”库来使这类事情变得更容易,但我不确定这是否真的是正确的方法? (图书馆:https://github.com/clintkpearson/IoCBridge https://github.com/clintkpearson/IoCBridge)

我不想直接从我的库中引用 DI 技术(Ninject、Windsor 等),因为这样会让使用它的人变得不灵活。

还有其他一些类似的问题,但似乎没有一个问题能够真正令人满意地解决问题。

作为旁注:我意识到我可以确保库遵循一般习惯用法并使用接口和 ctor 参数作为依赖项,然后将其留给使用应用程序来注册容器中的类型。

我能看到的唯一问题(如果我错了,请纠正我)是,这需要消费应用程序实际上know哪些类型链接到哪些接口,是否需要将某些类型注册为单例等等……从即插即用的使用角度来看,这是相当糟糕的。


有点有争议的 http://lostechies.com/chadmyers/2009/07/14/just-say-no-to-poor-man-s-dependency-injection/但我建议使用穷人注射液。我并不是说它很棒,但它在某些限制下有一些有效的用例(就像服务定位器)。它需要更多的维护,但它可以让您免于依赖另一个库来进行 IoC 容器注册。你应该阅读马克·西曼的文章 http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer/就此主题而言。

我最近在一个非常简单的库 https://github.com/uhaciogullari/SimpleMvcSitemap我的。基本上,您为库的公共类编写两个构造函数。

internal SitemapProvider(IActionResultFactory actionResultFactory, IBaseUrlProvider baseUrlProvider)
{
    _actionResultFactory = actionResultFactory;
    _baseUrlProvider = baseUrlProvider;
}

public SitemapProvider() : this(new ActionResultFactory(), new BaseUrlProvider()) { }

正如您所看到的,只有第二个构造函数是公共的,您自己填充依赖项。这也提供了组装级别的封装。您仍然可以通过添加一个来测试这个类内部可见 http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute%28v=vs.110%29.aspx属性到程序集并在库中自由使用依赖项注入。用户还可以使用 new 关键字创建实例或将此类的接口添加到其 IoC 注册中。

我不知道.NET中是否有广泛采用的IoC容器注册库。我想过自己写一个,但每个容器都有其独特的功能,并且对象生命周期变得更加复杂。人们也会因为依赖另一个图书馆而感到不安。

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

编写一个“启用”依赖注入的库 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如何隐藏RCP中的默认菜单?

    我是 Eclipse RCP 插件开发的新手 我用自己的视角编写了一个插件 并在其中添加了视角特定的菜单 我的问题是如何隐藏 Eclipse 中提供的默认菜单 例如 编辑 导航 搜索 项目 我尝试使用 并提出我的观点具体条件 以及菜单贡献
  • 未搜索SBT maven本地存储库

    我想从本地 Maven 存储库加载一些库 我已经配置了 sbt 0 13 plugins plugins sbt resolvers Resolver sonatypeRepo snapshots resolvers Resolver ma
  • Swift - 如何使用 XIB 文件创建自定义 viewForHeaderInSection?

    我可以像下面这样以编程方式创建简单的自定义 viewForHeaderInSection 但我想做更复杂的事情 可能与不同的类连接并像 tableView 单元格一样访问它们的属性 很简单 我想看看我在做什么 func tableView
  • 禁用 WebView 中的可选链接

    我有一个webView包含在一个scrollView 然后一切都包含在一个viewPager 当我跳到下一个视图页面时 页面中间的链接将被聚焦 文本周围以橙色突出显示 这会导致页面跳转到最近的链接 有没有办法禁止链接在触摸时聚焦 我已经尝试
  • 在Excel中计算不同值 - 频率函数

    我的任务是计算 Excel 中某一列中不同字符串的数量 后来快速谷歌搜索发现了以下公式here http office microsoft com en us excel HP030561181033 aspx Count 20the 20
  • 升级编译sdk版本后findViewById出错

    升级后编译SDK版本26 全部findViewById显示错误 没有足够的信息来推断 fun 中的参数 T findViewById id Int T 这是因为从 Android O 开始 我们不需要强制转换它 有几种选择 代替 val t
  • 我可以在同一台计算机上安装两个不同版本的 Visual Studio 吗?

    我可以在同一台计算机上安装 Visual Studio 2005 和 2010 吗 会造成什么问题吗 是的 你可以这样做 我在一台机器上安装了VS 2005 2008和2010 它们都是独立工作的 但是 在此之前 请记住 低版本制作的项目只
  • 如何重定向到 404 上的特定网址

    error 404 def error404 error return Nothing here sorry 这是响应404的方式bottle framework 但是在 404 上我想重定向到特定的 url 说http abc com h
  • 为什么不能创建抽象类的对象?

    这是我脑海中的一个场景 我用谷歌搜索了很多 但得到了像这样的答案 抽象类没有实现方法 所以我们无法创建对象 抽象 一词指示编译器不要创建该类的对象 但是在一个简单的类中 我们拥有所有虚拟方法 能够创建对象 此外 我们可以定义不同的访问权限来
  • 从 HSV 直方图中获取主色值

    我正在根据如下图像创建 HSV 直方图 void processImageWithHsv Mat image Mat image hsv cvtColor image image hsv CV BGR2HSV int hbins 50 sb
  • 如何停止 IIS 要求对本地主机上的默认网站进行身份验证

    我在 Windows XP Pro SP2 上安装了 IIS 5 1 此外 我还安装了带有 NET 3 5 的 VS 2008 Express 显然 IIS 已针对 NET 3 5 自动配置为 ASP NET 问题是每当我访问http lo
  • 如何确保weak_ptr不是从临时的shared_ptr创建的?

    我们来上课吧Foo和方法void use weak ptr std weak ptr
  • ANDROID:无法解析方法 getSupportActionBar()

    这件事让我发疯 我似乎无法让我的应用程序正确编译 我通过复制 jar 文件 将它们放入 libs 文件夹 右键单击并将它们添加为库 在我的应用程序中添加了支持库 我已经尝试扩展 ActionBaractivity 但仍然没有任何方法无法识别
  • 关于 C# 泛型最重要的事情...经验教训 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 删除字符串中 JavaScript 代码中的新行

    我在 javascript 文件的源代码中有一个带有换行符的字符串 如下所示 var str new line 现在我想删除代码中的换行符 我找不到任何关于此的内容 我一直在获取相关内容 n and r 提前致谢 编辑 2021 这个问题是
  • 刚习惯在 OS X 上的 emacs 中进行 paredit - 为什么 C-) 不起作用?

    我最近在 Mac OS X Leopard 中设置了 Common Lisp 编程环境 我发现 paredit 是一个不可或缺的 emacs 模块 Paredit 正在尽力帮助我更轻松地处理我的 Lisp 代码 但我遇到了一些陷阱 C 必然
  • Mongoose.js 交易

    我知道 MongoDB 不像关系数据库那样支持事务 但我仍然想知道如何实现多个操作的原子性 在网上搜寻 我看到人们提到没有交易的交易 http www infoq com presentations Transactions without
  • 如何在 C++ 中可靠地检查一个 Windows 进程是否是另一个 Windows 进程的父进程?

    我正在开发一个函数 它可以获取给定 PID 的父进程的 PID 该函数的原型是 DWORD getParentPid DWORD pid 为此 我正在使用CreateToolhelp32Snapshot http msdn microsof
  • 如何从应用程序内部启动 ClickOnce 应用程序的卸载?

    我可以可靠地启动 ClickOnce 应用程序的卸载吗 从应用程序内 换句话说 我想在其中一个表单上为用户提供一个大的 立即卸载我 按钮 当用户单击该按钮时 我想启动该应用程序的 Windows 卸载过程 并且可能关闭该应用程序 原因 我们
  • 编写一个“启用”依赖注入的库

    我目前正在开发一个项目 它将主要基于图书馆 我希望使用依赖项注入来使用该库 但我希望该库在很大程度上与所使用的容器无关 我不久前写了一个 桥 库来使这类事情变得更容易 但我不确定这是否真的是正确的方法 图书馆 https github co