Autofac:用参数解决依赖关系

2023-12-01

我目前正在学习 Autofac 的 API,并且正在尝试了解在我看来非常常见的用例。

我有一个类(对于这个简单的示例“MasterOfPuppets”),它具有通过构造函数注入接收的依赖项(“NamedPuppet”),该依赖项需要使用(字符串名称)构建一个值:

    public class MasterOfPuppets : IMasterOfPuppets
    {
        IPuppet _puppet;

        public MasterOfPuppets(IPuppet puppet)
        {
            _puppet = puppet;
        }
    }

    public class NamedPuppet : IPuppet
    {
        string _name;

        public NamedPuppet(string name)
        {
            _name = name;
        }
    }

我使用它们的接口注册这两个类,然后我想使用将注入“NamedPuppet”实例的字符串来解析 IMasterOfPuppets。

我尝试通过以下方式做到这一点:

IMasterOfPuppets master = bs.container.Resolve<IMasterOfPuppets>(new NamedParameter("name", "boby"));

这以运行时错误结束,所以我猜 Autofac 仅尝试将其注入“MasterOfPuppets”。

所以我的问题是,如何以最优雅的方式仅解析“IMasterOfPuppets”并将参数参数传递给它的依赖项? 其他ioc容器有更好的解决方案吗?


Autofac 不支持将参数传递给父/使用者对象并使这些参数渗透到子对象中。

一般来说我会说要求消费者了解其依赖项接口背后的内容是糟糕的设计。让我解释:

根据您的设计,您有两个界面:IMasterOfPuppets and IPuppet。在示例中,您只有一种类型IPuppet - NamedPuppet。请记住,拥有接口的目的是将接口与实现分开,您的系统中也可能有这样的:

public class ConfigurablePuppet : IPuppet
{
  private string _name;
  public ConfigurablePuppet(string name)
  {
    this._name = ConfigurationManager.AppSettings[name];
  }
}

有两件事需要注意。

首先,你有一个不同的实现IPuppet应该可以代替任何其他IPuppet当与IMasterOfPuppets消费者。这IMasterOfPuppets实施永远不应该知道实施IPuppet改变了……消耗的东西IMasterOfPuppets应该进一步删除。

二、两个例子NamedPuppet和新的ConfigurablePuppet接受一个同名的字符串参数,但是它意味着与支持实现不同的东西。因此,如果您的消费代码正在执行示例中所示的操作 - 传递一个旨在作为name的事情 - 那么你可能有一个界面设计问题。看:里氏替换原则.

要点是,鉴于IMasterOfPuppets 执行需要一个IPuppet通过,它不应该关心how the IPuppet是为了开始或实际支持什么而构建的IPuppet.一旦它知道,你就打破了接口和实现的分离,这意味着你也可以取消接口并直接传入NamedPuppet始终是对象。

就传递参数而言,Autofac 确实有参数支持。

推荐且最常见的参数传递类型是注册期间因为那时您可以在容器级别进行设置,并且您没有使用服务位置(即通常被认为是反模式).

如果解析时需要传递参数Autofac 也支持。然而,当在解析过程中传递时,它更像是服务定位器,而不是那么好,因为它再次意味着消费者知道它正在消费什么。

你可以做一些花哨的事情lambda 表达式注册如果您想连接来自已知来源的参数,例如配置。

builder.Register(c => {
  var name = ConfigurationManager.AppSettings["name"];
  return new NamedPuppet(name);
}).As<IPuppet>();

您还可以使用做一些奇特的事情the Func<T>隐含关系在消费者中:

public class MasterOfPuppets : IMasterOfPuppets
{
    IPuppet _puppet;

    public MasterOfPuppets(Func<string, IPuppet> puppetFactory)
    {
        _puppet = puppetFactory("name");
    }
}

这样做相当于使用TypedParameter类型的string决议期间。但是,正如你所看到的,这来自于直接消费者IPuppet而不是从所有决议的堆栈中滴下来的东西。

最后,您还可以使用Autofac模块按照您在中看到的方式做一些有趣的横切事情log4net集成模块示例。使用这样的技术允许您通过所有分辨率全局插入特定参数,但它不一定提供在运行时传递参数的能力 - 您必须将参数的源放入模块内。

重点是Autofac 支持参数,但不支持您想要执行的操作。我强烈建议重新设计您做事的方式,这样您实际上就不需要做您正在做的事情,或者您可以通过上述方式之一来解决它。

希望这能让您朝着正确的方向前进。

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

Autofac:用参数解决依赖关系 的相关文章

  • Unity / EntLib:将依赖项注入 CustomTraceListener

    抱歉 这是一个非常特殊的话题 所以很多人可能不感兴趣 但是 我需要做以下事情 我有一个应用程序 它提供对某种控制台窗口的日志记录 它是一个 WPF 窗口 因为应用程序要求 而且应用程序即使在这里也需要看起来很华丽 我们的特殊客户要求这样做
  • Autofac 与 Owin

    我有一个问题Autofac 该文档明确指出 当使用 Web API 2 和 OWIN 时 您must not use GlobalConfiguration Configuration任何地方 OWIN 集成中的一个常见错误是使用 Glob
  • 何时在 Ninject 中停用瞬态范围对象?

    当 Ninject 中的对象与InTransientScope 该对象不会放入缓存中 因为它是 呃 瞬态的并且没有任何范围 完成该对象后 我可以调用kernel Release obj 这会传递到缓存 在缓存中检索缓存的项目并调用Pipel
  • 带有运行时构造函数参数的键控委托工厂?

    假设我有以下服务和组件 public interface IService void DoWork public class ServiceA IService private readonly string name public Ser
  • 从 beta 升级后出现 Autofac / MVC4 / WebApi (RC) 依赖注入问题

    var resolver new AutofacWebApiDependencyResolver container configuration ServiceResolver SetResolver resolver 更新到 ASP NE
  • 使用 AutoFac 注入通用类型参数

    我想我真的很困惑我能用 AutoFac 做什么 有人可以让我走上正轨吗 我有一个基本类型 class PersonBase public string SaySomething return I am base 我派生出两个具体的类 cla
  • 如何解决 MVC 过滤器属性中的依赖注入

    我有一个从 AuthorizationAttribute 派生的自定义属性类 它对控制器操作执行自定义安全性 OnAuthorizationCore 方法依赖于各种其他组件 例如 DAL 来判断用户是否可以调用操作 我正在使用 Autofa
  • Autofac 在 Web.Config 上丢失注册编辑

    我有一个使用 ASP NET MVC 4 WebAPI 和其他一些组件构建的分层 Web 应用程序 我使用最新版本的 Autofac 2 6 2 859 作为我的 DI 容器以及 MVC 和 WebAPI 集成 我在不同的层中设置了 aut
  • Ninject:每个被拦截的类实例有一个拦截器实例?

    我目前遇到一个问题 尝试为每个被拦截的类实例连接一个拦截器实例 我正在 InterceptorRegistrationStrategy 中创建 Advice 并设置回调以解析来自内核的拦截器 它有一个注入构造函数 请注意 我只能在回调中实例
  • 使用 Autofac 注入接口的特定实例

    我有一个控制器 它接收接口的特定实例 界面看起来像这样 public interface IMyInterface implementation goes here 然后我有一些类实现这个接口 如下所示 public class MyCla
  • 何时使用 IOC 容器?

    我试图了解何时应该使用容器而不是手动注入依赖项 如果我有一个使用 1 2 个接口的应用程序 并且每个接口只有 1 2 个具体实现 我会倾向于自己处理 如果我有一个使用 2 3 个接口的小型应用程序 并且每个接口有 2 3 个具体实现 我应该
  • 如何在 ASP.NET MVC 4 中使用 Autofac 注入 HttpContextBase

    我在用ASP MVC 4 and Autofac 我已在我的中注册了以下内容global asax cs file ContainerBuilder builder new ContainerBuilder builder Register
  • 如何使用 IoC 容器组织 MVP?

    我正在尝试使用 winforms 应用程序来理解 IoC 概念 假设我有一个演示者 其构造函数将其视图和服务作为构造函数参数 所以在表单代码中我有这样的东西 mnPresenter new Presenter this new AppSer
  • 使用 MiniProfiler、EF 5 和 Autofac 分析 DbContext 的正确方法

    The MiniProfiler 站点 http miniprofiler com 给出了用于生成实体框架的以下代码ObjectContext public static MyModel Get var conn new StackExch
  • 将 Autofac 与 ASP.Net Core 3.1 通用主机“Worker Service”应用程序结合使用

    在 ASP Net Core 应用程序中 可以使用以下方式轻松配置 Autofac public class Program public static void Main string args ASP NET Core 3 0 The
  • 简单注入器从命名空间注册所有服务

    我的服务接口的命名空间为Services Interfaces 服务接口的实现有一个命名空间Web UI Services 例如 我有 2 个服务实现 IUserService 需要注册到UserService ICountryServic
  • PostSharp AssemblyLoadException Autofac

    我正在设置一个新的解决方案 我想在其中使用最新的 Autofac 3 4 和 PostSharp 3 1 42 引用 NuGet 包后 出现以下错误 并且我无法弄清楚发生了什么 我从未选择 Autofac 3 3 0 包 包 config
  • MVC Web API 无法与 Autofac 集成一起使用

    我使用了 autofac 的 MVC 集成 如下所示 var container builder Build DependencyResolver SetResolver new AutofacDependencyResolver cont
  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的

随机推荐

  • Phonegap:带有背景图像的相机视图

    我使用 Phonegap 和 Sencha Touch 来获得相机功能 但我希望将具有透明背景的图片叠加在实时相机视图上 而不是默认的相机视图 类似于下面的示例 其中恐龙图像已叠加在相机视图图像上 你能告诉我这个功能是否可以通过Phoneg
  • google-services.json 适用于不同的productFlavors

    Update GCM已弃用 请使用FCM 我正在按照 Google Developers 页面的指南实施新的 Google Cloud Messaginghere 我已经成功运行并测试了它 但我现在的问题是我有不同的产品风格 具有不同的 a
  • Microsoft Dynamics NAV Web 服务中的日期筛选器

    当在 php 中向 Web 服务发送过滤器时 一切正常 但是当我们需要对日期进行排序时 我们遇到了问题 我们需要获取在特定日期之后修改的所有对象 在页面中我们有一个日期元素 如下所示
  • 从 Outlook webaddin 打开 url 时弹出窗口被阻止错误

    当用户单击插件视图中的按钮时 我尝试打开网址 但网络插件抛出错误 我的打开网址的代码 let a document createElement a a setAttribute target blank a setAttribute sty
  • 访问共享文件?

    我试图通过 UNC 路径从 Windows 共享文件夹中读取文件正文 并收到此异常 The process cannot access the file
  • 禁用 matplotlib pyplot 的输出

    我有一个数组A形状 1000 2000 我使用 matplotlib pyplot 来绘制数组 这意味着 1000 条曲线 使用 import matplotlib pyplot as plt plt plot A 该图很好 但有一千行
  • 将 Cloud Functions 执行隐藏在 Cloud Endpoints 后面

    我想知道是否可以限制 隐藏使用云端点对我的云功能的直接访问 我跟着this来自谷歌的教程 在链接上它说 通过此设置 ESP 会拦截对您的函数的所有请求 并在调用该函数之前执行任何必要的检查 例如身份验证 我成功完成了本教程 在端点上添加了
  • Android 中的 EditText 视图中允许多行吗?

    如何在Android中允许多行EditText view 默认情况下所有EditTextAndroid 中的小部件是多行的 这是一些示例代码
  • 在 Windows 命令行中使用双引号提取密码存档

    我想从 PHP 中提取存档文件 zip rar z7 gz 等 因为密码可以包含特殊字符 例如 并且 PHP exec 不支持 unicode 字符 出于某种原因 我最终使用了一个批处理文件 如此处所述php exec 在 unicode
  • 无法打开包含文件:“io.h”:没有这样的文件或目录

    我试图使用 Cython 编译一个简单的 pyx 文件 print hello 这是我的 setup py from distutils core import setup from Cython Build import cythoniz
  • 根据 VBA 2010 中的字符断开字符串

    在 Excel 2010 中 使用 VBA 如何在找到某个字符时拆分字符串 Let say A1 This is a test of the emergency broadcast signal 我将其分配给一个变量 例如 strColum
  • React Native - 当应用程序不在后台时深度链接不起作用(Android,iOS)

    if app in background 将打开特定屏幕 if app is not in background or kill the app 它只会显示第一个屏幕 Linking getInitialURL 返回 null 如果您想在应
  • 如何查找我的 Subversion 服务器版本号?

    我想知道我的服务器是否运行 Subversion 1 5 我怎样才能找到它 如果知道我的 SVN 客户端版本号也很高兴 svn help没有帮助 Note 我不想要我的项目的修订号等 这个问题是关于颠覆软件 itself 要查找 subve
  • 如何将对象传递给 HttpClient.PostAsync 并序列化为 JSON 正文?

    我在用着System Net Http 我在网上找到了几个例子 我设法创建了这个代码POST要求 public static string POST string resource string token using var client
  • 在 MapKit 中显示行车路线

    有没有办法在 iPhone MapKit 中显示行车路线 有没有办法从 google MAPs API 获取 XML 或其他格式的路线坐标和名称 例如 不可以 您不能使用 MapKit 获取行车路线 它不支持这一点 但是 您可以在 MapK
  • 使用 NetTcpBinding 进行双工通信 - ContractFilter 不匹配?

    我正在使用 NetTcpBinding 在客户端和服务器之间打开双工通信通道方面取得缓慢而稳定的进展 仅供参考 你可以观察我的新手进度here and here 我现在正处于已成功连接到服务器的阶段 通过服务器的防火墙 客户端可以向服务器发
  • 向 Chrome 扩展程序的右键菜单添加选项

    有谁知道是否可以在 Chrome 中的鼠标右键菜单中添加另一个与扩展程序通信的选项 我的意思是 安装扩展程序后 鼠标右键单击菜单中会出现另一个选项 该选项会将数据发送到扩展程序打开的侦听器 这是解决方案 rightClickHandler
  • Yii URL 管理 HTTPS

    我使用代码来分隔网站中的 HTTPS 和 HTTP 页面 问题是 当我使用 HTTP 时 到 HTTPS 的链接没有 WWW 反之亦然 我在脚本中没有发现问题 public function createUrl route params a
  • 如何找到python包的反向依赖

    我有一个虚拟环境 其中elasticsearchpython 包已安装 我想找到哪个包依赖elasticsearch并在虚拟环境中进行安装 venv root test pip freeze grep elast elasticsearch
  • Autofac:用参数解决依赖关系

    我目前正在学习 Autofac 的 API 并且正在尝试了解在我看来非常常见的用例 我有一个类 对于这个简单的示例 MasterOfPuppets 它具有通过构造函数注入接收的依赖项 NamedPuppet 该依赖项需要使用 字符串名称 构