我们有两个应用程序共享一些具有依赖项的公共类。这些依赖项对于两者或特定于应用程序都是相同的。
现在为这两个应用程序配置 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。
但是我必须为每个依赖于 IDependacy 的类以及依赖于该类的每个类等等都这样做 - 继续我的工作。
使用工厂。
但是您仍然必须以某种方式告诉它您想要哪种实现。所以我必须从上到下传递这些信息 - 这似乎有点......错误,因为这些是不应该知道有一些应用程序 A 或 B 的常见类。
所以..我迷路了。我不确定这是否适用于 IoC 或更好的设计。请指教。
(我真的不在乎我使用哪个 IoC 容器 - 只要它是好的和维护的)
绝地无双
相关分类