【问题标题】:C# MVC5 AutoFac IoC - Resolve based on requesting classC# MVC5 AutoFac IoC - 根据请求类解析
【发布时间】:2019-04-12 04:55:30
【问题描述】:

我正在尝试在 MVC5 项目中配置 Autofac,以根据请求它的类返回接口的特定实现。

这是我使用 Laravel 框架对 PHP 做的很多事情,它提供了如下解决方案:

$this->app->when(PhotoController::class)
          ->needs(Filesystem::class)
          ->give(function () {
              return Storage::disk('local');
          });

到目前为止,我的谷歌搜索还不够,大多数答案建议我注入一个工厂(调用容器)或它自己的容器,然后从那里提取我需要的服务。

真的没有办法实现类似上面的东西吗?

【问题讨论】:

  • 我不确定“when....需要”是什么意思。另外,FileSystem 应该是接口还是基类?您可以:1) 创建一个以 Filesystem 作为参数的 PhotoController 类,或 2) 创建一个以工厂为参数的 PhotoController 类,或 3) 创建一个以委托为参数的 PhotoController 类。如果需要,工厂或委托将负责在运行时创建 Filesystem 的实例。
  • 嗨 Jarimba,是的,文件系统将是上面示例中的接口,通常 I 前缀在 PHP 中不使用,但在 IDE 中会很清楚。本质上和英文读的完全一样,当A类需要A接口时,给它B类。这是能够根据我感兴趣的请求者解析接口的逻辑。它在PHP中证明非常有用。
  • 你有read this related FAQ吗?
  • @TravisIllig 我有,但没有意识到它在示例的上下文中做了什么,Peter Casjtai 在助手下方的回答将其清除。 :)

标签: c# dependency-injection asp.net-mvc-5 inversion-of-control autofac


【解决方案1】:

有注册条件依赖的选项,Autofac最简单的是命名注册(AFAIK):

builder.Register(c => new DiskStorage()).Named<IStorage>("disk");
builder.Register(c => new PhotoController(c.ResolveNamed<IStorage>("disk")));

【讨论】:

  • 这可行,但我觉得 OP 需要更多动态,因为他/她的评论是:inject inject either a Factory (...) or the Container itself, and pull the Service I need from there。他可能需要使用factory method ;-)
  • 感谢@péter-csajtai,这看起来很有希望,但是您知道我是否可以调用new DiskStorage() 而无需手动构建它的依赖项?目前我不得不做builder.Register(c =&gt; new DiskStorage(new DependencyA(new DependencyB()))).Named&lt;IStorage&gt;("disk");
  • 您可以让容器解决存储的顶级依赖关系,例如:new DiskStorage(c.Resolve&lt;DependencyA&gt;())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2011-01-02
相关资源
最近更新 更多