StructureMap 和嵌套泛型

2024-01-01

我想知道是否有一种方法可以在其中连接嵌套泛型StructureMap无需指定内部类型或创建特定于类型的接口。我意识到这有点令人困惑,因此编码示例可能是对我正在寻找的功能的更好解释。

public interface IParser<T> { }
public class Range<T> where T : struct { }
public class RangeParser<T> : IParser<Range<T>> { }

理论上,我希望能够遵循 StructureMap 的开放通用功能,如下所示:

For(typeof(IRepository<>)).Use(typeof(Repository<>)).

我意识到我不能这样做:

For(typeof(IParser<Range<>>).Use(typeof(RangeParser<>));

我尝试通过反射来做到这一点MakeGenericType但是,我似乎遇到了这种方法的问题。

var requestedType = typeof(IParser<>).MakeGenericType(typeof(Range<>));
For(requestedType).Use(typeof(RangeParser<>));

任何想法将不胜感激。


StructureMap 在支持开放泛型方面非常有限。和简易注射器 https://simpleinjector.org/另一方面,您可以执行以下操作:

// using SimpleInjector.Extensions;

container.RegisterOpenGeneric(typeof(IParser<>), typeof(RangeParser<>));

这将映射IParser<Range<T>> to RangeParser<T> where T is a struct。如果您有多个通用实现IParser<T>您可以简单地添加额外的实现:

container.RegisterOpenGeneric(typeof(IParser<>), typeof(RangeParser<>));
container.RegisterOpenGeneric(typeof(IParser<>), typeof(ReferenceTypeParser<>));

您唯一需要确保的是注册不重叠。当您尝试解析(或注入)已关闭的对象时,简单注入器将抛出异常IParser<T>可以通过多个注册处理的类型。

如果存在一些重叠,您可以为RegisterOpenGeneric像这样的方法:

container.RegisterOpenGeneric(typeof(IParser<>), typeof(RestrictiveParser<>));
container.RegisterOpenGeneric(typeof(IParser<>), typeof(FallbackParser<>), 
    c => !c.Handled);

这些注册将按注册顺序进行评估。

您可以使用泛型类型约束作为自然过滤器,简单注入器将遵循它们。如果泛型类型约束不能解决问题,您始终可以注册部分开放泛型类型:

container.RegisterOpenGeneric(typeof(IParser<>), 
    typeof(SomeParser<>).MakeGenericType(typeof(List<>));

在所有 .NET IoC 框架中,Simple Injector 对泛型类型的支持最好:

  • 它理解泛型类型约束。
  • 它允许复杂的嵌套泛型类型映射。
  • 它允许提供部分开放的泛型类型。
  • 它允许将通用装饰器应用于类型。
  • 它允许根据泛型类型约束有条件地应用泛型装饰器。
  • 它允许注册集合,其中混合了非泛型实现和所提供的开放泛型类型的自动确定的封闭版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StructureMap 和嵌套泛型 的相关文章

  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim

随机推荐

  • 为 api 26 设置 Gradle (Android)

    由于我已将 Nexus 5x 升级到 Android O DP3 我无法测试我的应用程序 我收到错误消息是因为没有配置我的 Gradle 文件以使用新的 API 级别 26 所以我更改了它和依赖项 但我在所有支持库上不断收到错误 例如 Fa
  • Google Service Plugin 3.2.0 导致 Gradle 构建失败

    我正在尝试更新 Google 服务插件 但在 Gradle 同步期间收到错误 项目刷新失败 错误 未找到匹配项 版本 3 1 1 一切正常 但一旦我将 build gradle 更新为 classpath com google gms go
  • Angular 1.5 & ES6 - 依赖注入

    我是 Angular 新手 我正在尝试使用 ES6 我的依赖注入有问题 我无法让它工作 我的index js import index state css import angular from angular import angular
  • 无法更改 Visual Studio 2017 中程序集的默认语言

    我的应用程序支持三种语言 en es 和 fr 当我构建我的 干净的 从模板 UWP 应用程序时 我收到消息 warning PRI257 0xdef00522 Resources found for language s en es fr
  • 如何按位和 CFBitVector

    我有两个实例CFMutableBitVector 像这样 CFBitVectorRef ref1 ref2 我怎样才能对这些家伙进行按位运算 目前我只关心and 但显然xor or等了解一下会很有用 显然 我可以迭代向量中的位 但当我在位级
  • Noob to PowerShell,复制文件夹内的文件

    抱歉 如果这是一个非常简单的过程 我有一个文件夹结构 根级别有大约 4 000 个目录 空 另一个位置有另一组包含数据的文件夹 我只想将 location2 中的文件夹中的文件复制到 location1 中的文件夹 即 FolderABC1
  • 以百分比形式显示会话的 Oracle CPU 使用率

    以下脚本返回活动会话的 CPU 使用情况 结果显示 CPU 使用率 以秒为单位 我需要的是相同的报告 其中包含 CPU 使用率百分比 做这个的最好方式是什么 Show CPU Usage for Active Sessions SET PA
  • 以编程方式转储调用堆栈

    寻找一种方法 在遇到一段代码时以编程方式转储调用堆栈和 net Win Forms 应用程序 这是我以前从未遇到过的东西 但会节省我一些调试时间 更新 忘记添加 这会给应用程序增加多少开销 即它会大大减慢应用程序的速度 System Env
  • 设置 WH_KEYBOARD 挂钩失败并出现错误 1428

    这是我的 C 代码 include
  • 如何获取显示引用的 C# 库的 XML 文档?

    假设您有一个包含多个函数的 C 库 所有函数都使用通常的文档记录
  • ghci 未从文件加载函数

    在 test hs 中 我有 doubleMe x x x 在 ghci 中 我输入 Prelude gt l test 1 of 1 Compiling Main test hs interpreted Ok modules loaded
  • 预处理 SHA256 Python 实现

    我正在维基百科上完成 SHA256 的实现 但遇到了困难 我刚刚尝试编写消息预处理的代码 最终消息的长度是 504 位 而不是所需的 512 位 维基百科 SHA256 http en wikipedia org wiki SHA 2 预处
  • 从 Google Play 删除未发布的应用

    我在我的 Google Play 帐户中创建了一个新应用程序 我没有发表还没完成 它刚刚准备好发布 由于它尚未发布 有什么方法可以将其从我的帐户中永久删除吗 我找不到任何删除或删除按钮 我读here https stackoverflow
  • 在 iOS 中集成 Google 和 Facebook 登录 - AppDelegate openURL

    我正在尝试将 facebook 和 google 登录集成到我的应用程序中 但遇到了问题 两者都需要将以下内容添加到 Appdelegate 中的 openURL 方法中 return GIDSignIn sharedInstance ha
  • 为什么 `print(object)` 显示 `<__main__.对象位于 0x02C08790>`?

    我不断得到 lt main Camera object at 0x02C08790 gt 我不知道为什么 我希望代码基本上在一个循环中从 Calc Speed 转到 Counter 然后返回到 Calc Speed class Camera
  • MSBuild:如何为 Web 部署项目(VS2010)构建 Web 部署包?

    我将一个网站项目 带有 Web 部署项目 从 VS2008 迁移到 VS2010 现在我可以在 VS2010 中为 Web 部署项目制作 构建部署包 效果非常好 但我找不到通过 MSBuild 执行相同操作的方法 我回答我的一个问题 经过大
  • COM 字符串 (BSTR) 和 .NET 字符串有什么区别?

    这只是字节组合来 编码 数据的方式吗 我很好奇 因为我想知道 RCW 如何自动获取 NET 字符串并将其转换为 COM BSTR 我猜测它只是形成了从 NET 字符串转换而来的有效 COM BSTR 相关 我可以使用 NET 中的字节类型构
  • 从上下文资产中的 Uri 加载 MediaPlayer

    我的资产目录中有一个音频文件 资产 音频 dance mp3 如果我运行 context getAssets list audio 它出现了 但是当我尝试使用 MediaPlayer create context uri 时它总是失败并返回
  • 安装适用于 Python 的 TextBlob 时遇到问题

    我是编程新手 我正在尝试安装 Python 的 TextBlob 库来帮助我做一些事情 遗憾的是 我在安装 TextBlob 时遇到了麻烦 更不用说使用它了 我使用的是Windows 这似乎让事情变得更加困难 我希望我可以只运行 Linux
  • StructureMap 和嵌套泛型

    我想知道是否有一种方法可以在其中连接嵌套泛型StructureMap无需指定内部类型或创建特定于类型的接口 我意识到这有点令人困惑 因此编码示例可能是对我正在寻找的功能的更好解释 public interface IParser