【发布时间】:2018-08-15 08:29:27
【问题描述】:
我们有两个应用程序共享一些具有依赖关系的公共类。 然后,这些依赖关系对于两者或特定于应用程序都是相同的。
现在为两个应用配置 IoC 很容易 - 将 ImplementationA 用作一个应用的 IDependency,将 ImplementationB 用作另一个应用的 IDependency。
但是-有时,当解析接口时,第三个应用程序需要使用应用程序 A 的依赖项,有时需要使用 B 的依赖项。换句话说,我需要这样的东西:
Resolve<ISomething>( when you come accross IDependecy (anywhere in the 'resolve tree') use ImplementationA)
Resolve<ISomething>( when you come accross IDependecy (anywhere in the 'resolve tree') use ImplementationB)
所以核心问题是:如何从 Resolve 调用中将上下文传递给选择实现的任何逻辑?
具体例子:
.NET Core MVC App - 从请求中解析枚举值。现在我需要调用一些 IManagerFactory,将此枚举作为参数传递,并获取管理器的实现以及来自应用程序 A 或 B 的所有依赖项。(再次强调,不仅仅是管理器本身的依赖项)
从请求中获取上下文非常耗时,所以我只想做一次。这已经在方法开始时完成了。像这样
public async Task<Response> ProcessRequest([FromBody] Request request)
{
var context = _someService.GetContext(request);
var appType = ParseAppTypeFromContext(context);
...
var manager= _managerFactory.Resolve(appType);
manager.DoSomething();
manager.DoSomethingElse();
}
可能的解决方案:
- 我可以注册 ISomethingA,使用注册委托并让它通过 ResolvedParameter(Autofac 功能)解析正确的依赖关系 - 然后只需解析 ISomethingA。
但我必须为依赖于 IDependecy 的每个类和依赖于该类的每个类都这样做,依此类推 - 继续努力。
- 使用工厂。
但是您仍然必须以某种方式告诉它您想要哪种实现。所以我必须从上到下传递这些信息 - 这似乎有点.. 错误,因为这些是不应该知道有一些应用程序 A 或 B 的常见类。
所以.. 我迷路了。我不确定这是否适用于 IoC 或更好的设计。请指教。
(我并不关心我使用哪个 IoC 容器——只要它良好且维护良好)
【问题讨论】:
标签: c# dependency-injection ioc-container