Autofac。如何使用自定义方法(属性)来解析某些接口?

2024-01-01

我有以下接口:

public interface IConfigurationProvider<TSettings> where TSettings : ISettings, new() 
{
       TSettings Settings { get; }
}
public interface ISettings
{
}

我有以下 IConfigurationProvider 实现:

public class ConfigurationProvider<TSettings> : IConfigurationProvider<TSettings> where 

    TSettings : ISettings, new()
        {
            public ConfigurationProvider() 
            {
                this.BuildConfiguration();
            }

            public TSettings Settings { get; private set; }

            private void BuildConfiguration() 
            {
                this.Settings = new TSettings();
                //...load and assign properties to 'this.Settings'
                //...skipped
                // now 'Settings' property contains configured 'ISettings' instance
            }
        }

我还可以有不同的类实现“ISettings”接口。例如,

public class UserSettings : ISettings
    {
        public int SomeProperty1 { get; set; }
        public int SomeProperty2 { get; set; }
    }


public class CatalogSettings : ISettings
    {
        public int SomeProperty3 { get; set; }
        public int SomeProperty4 { get; set; }
    }

我使用以下代码来配置“ContainerBuilder”:builder.RegisterGeneric(typeof(ConfigurationProvider<>)).As(typeof(IConfigurationProvider<>));

效果很好。为了获取“UserSettings”,我使用以下代码:

var userSettingsProvider = builder.Resolve<IConfigurationProvider<UserSettings>>();
var userSettings = userSettingsProvider.Settings;

问题:我应该如何配置“ContainerBuilder”,以便可以通过以下方式解析某个“ISettings”:

var userSettings = builder.Resolve<UserSettings>();

Autofac 可以吗?

提前致谢


你可以用IRegistrationSource - see http://nblumhardt.com/2010/01/declarative-context-adapters-autofac2/ http://nblumhardt.com/2010/01/declarative-context-adapters-autofac2/以获得概述。

基本结构是:

class SettingsSource : IRegistrationSource {
    static readonly MethodInfo BuildMethod = typeof(SettingsSource).GetMethod(
        "BuildRegistration",
        BindingFlags.Static | BindingFlags.NonPublic);

    public IEnumerable<IComponentRegistration> RegistrationsFor(
            Service service,
            Func<Service, IEnumerable<IComponentRegistration>> registrations) {
        var ts= service as TypedService;
        if (ts != null && typeof(ISettings).IsAssignableFrom(ts.ServiceType) {
            var buildMethod = BuildMethod.MakeGenericMethod(ts.ServiceType);
            yield return (IComponentRegistration) buildMethod.Invoke(null, null);
        }
    }

    static IComponentRegistration BuildRegistration<TSettings>()
            where TSettings : ISettings {
        return RegistrationBuilder
            .ForDelegate((c, p) =>
                c.Resolve<IConfigurationProvider<TSettings>>().Settings)
            .CreateRegistration();
    }

    public bool IsAdapterForIndividualComponents { get { return false; } }
}

这是这样注册的:

builder.RegisterGeneric(typeof(ConfigurationProvider<>))
    .As(typeof(IConfigurationProvider<>));
builder.RegisterSource(new SettingsSource());

(未编译或测试,所以如果它失败请告诉我;))

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

Autofac。如何使用自定义方法(属性)来解析某些接口? 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 如何使用 Atlassian Confluence 的 REST API 发表评论?

    我正在尝试使用 REST API 自动向页面添加评论 我正在使用 Postman 进行测试 我指向这个网址 https atlassian net wiki rest api content https atlassian net wiki
  • 取消投影对象拾取的结果

    网络上有很多对此的参考 包括来自 stackoverflow 的参考 我有一个 unproject 方法 它返回 x y 坐标 返回范围为 1 和 1 我想知道这些值是否正确 如果是这样 那么我该如何处理这些值 乘以相机位置 参考 如何将屏
  • 使用 sklearn 通过 Keras 数据生成器绘制混淆矩阵

    Sklearn 明确定义了如何使用自己的分类模型绘制混淆矩阵plot confusion matrix https scikit learn org stable auto examples model selection plot con
  • componentDidUpdate 与 componentDidMount

    当满足以下条件时 我需要确保输入元素获得焦点 DOM 可用 并且属性发生了变化 问题 我需要将我的代码放入两个中吗componentDidUpdate and componentDidMount要不就componentDidUpdate就足
  • 如何在轴标签和图例中的下标中写入文本?

    我有以下轴标签和图例 plt ylabel ratio 2 plt xlabel n 1 plt legend alpha 1 alpha 2 loc best shadow True 在公式周围加上美元符号 plt xlabel n 1
  • 使用 webdriver 与可爱的编辑器交互

    有谁知道我如何使用 webdriver 与可爱的编辑器交互 我想清除文字 下面的代码不起作用 driver switchTo frame 0 driver switchTo activeEle
  • 是否可以在用户不与网络交互的情况下播放音频?我该怎么做呢? [复制]

    这个问题在这里已经有答案了 我需要我的网页在用户不与页面交互的情况下播放音频剪辑 我知道用户体验很差 不应该这样做 但这就是我的客户所要求的 我也知道浏览器已经阻止了这个功能 所以如果有人能给我建议如何 破解 这个规则 例如事件 我将不胜感
  • 如何在 Sphinx 运行时预处理源文件?

    我已经为我的项目设置了 Sphinx 文档 并希望提取源文件的文档字符串并将它们嵌入到最终文档中 不幸的是 Sphinx 不支持源文件的语言 VHDL VHDL 似乎没有 Sphinx 域 所以我的想法如下 挂钩 Sphinx 运行并在 S
  • 如何在maatwebsite中获取excel数组

    我正在尝试使用最新版本将 Excel 文件转换为数组Laravel Excel https github com Maatwebsite Laravel Excel 3 1 9 下面的代码将下载该文件 return Excel downlo
  • 一个图例的两个独特标记符号

    我想在图例下的 红色实心圆圈 符号旁边添加一个 红色实心正方形 符号 我该如何实现这一目标 我更喜欢坚持使用 pyplot 而不是 pylab 下面是我一直在使用的代码 fig plt figure ax1 fig add axes 0 1
  • 条件逻辑在默认的knockout.js 2.0模板引擎下工作吗?

    下面的条件不适用于我的默认模板与 knockout js 2 0 它只是写出 IF 语句 span if data app viewModel admin home paging page span span else a href a i
  • CPU 总使用率 - 多核系统

    我正在使用 xen 并与xen top我得到了 CPU 总使用率的百分比 NAME STATE CPU sec CPU MEM k MEM MAXMEM k MAXMEM VCPUS NETS NETTX k NETRX k VBDS VB
  • 日期时间差异返回正确的月份甚至年份?

    是否有任何内置函数如何以比仅天数更好的方式获取 DateTime 对象之间的差异 我的意思是 1 个月零 23 天 我发现由于每个月的天数 闰年等不同 计算起来非常困难 谢谢 看一下野田时间 http noda time googlecod
  • “Typemock Isolator”如何模拟静态方法?

    正如你们中的一些人所知 通常不可能在 net 中模拟静态方法 通过模拟 我的意思是用具有相同签名的另一个方法替换类中的方法 通常用于测试目的 用于模拟方法的两种主要方法是将其声明为虚拟方法或在接口中定义它 net 静态方法不允许使用这两种方
  • Chrome“无法拖动”图标会干扰鼠标悬停事件,我该如何防止这种情况?

    下面是一些使用 JavaScript 创建一堆 div 元素来充当像素的代码 我为 mouseover 事件添加了一个事件侦听器 并检查鼠标是否被按下 如果按下鼠标 我会更改该像素的颜色 最终结果是一个简单的绘图函数 我相信使用 HTML5
  • Entity Framework Core:获取所有表的列表

    如何获取数据库上下文中 Entity Framework Core 中所有表的列表 以下答案适用于 Entity Framework 5 中的早期版本 我们目前使用的是 EF Core 3 如何获取 EF 5 中所有实体的列表 https
  • 在 Propel 1.5 中执行多个条件的连接

    这个问题是从问题而来的here https stackoverflow com questions 6877226 rewriting not in sub select as join for propel and here https
  • 带有复杂编辑器的 JTable

    我有许多用于 JTable 的自定义编辑器 可以轻描淡写地说 其可用性 尤其是在使用键盘进行编辑方面 缺乏可用性 主要原因是我的编辑器总是在与此类似 尽管通常更复杂 的情况下创建 Override public Component getT
  • 从 SELECT 插入但更改一列?

    想知道是否有一种方法可以将行从另一个表插入到另一个表中 但一列除外 对于有限数量的列来说 这当然很容易 但是当列数增加时 列出所有列会有点烦人 我在想一些事情 Insert into table select replace col1 wi
  • Autofac。如何使用自定义方法(属性)来解析某些接口?

    我有以下接口 public interface IConfigurationProvider