我认为您的前提在这里有点混乱,您说的是注入工厂,但是工厂模式是一种创建模式,其目的是做一个依赖项注入框架的子集,而当DI框架并不普遍时,这种模式就是因此很有用。但是,如果您具有DI框架,那么您不再真正需要工厂,因为DI框架可以实现工厂将要实现的目的。
就是说,让我解释一下有关依赖注入以及您通常如何使用它。
进行依赖注入的方法有很多种,但是最常见的是构造函数注入,属性注入和直接DIContainer。我将谈到构造函数注入,因为在大多数情况下,属性注入是错误的方法(有时是正确的方法),DIContainer访问不是可取的,除非您绝对不能使用其他任何一种方法。
构造函数注入是您具有依赖项接口的地方,以及知道该依赖项具体实现的DIContainer(或工厂),以及需要依赖该接口的对象的任何地方,在构造时,您将实现从工厂移交给它。
即
IDbConnectionProvider connProvider = DIContainer.Get<IDbConnectionProvider>();
IUserRepository userRepo = new UserRepository(connProvider);
User currentUser = userRepo.GetCurrentUser();
许多DI框架可以大大简化此操作,您的DIContainer会在其中检查UserRepository的构造函数以了解其具体实现的接口,并自动将这些接口交给您。这种技术通常称为控制反转,尽管DI和IoC都是互换性很强(如果有的话)的术语。
现在,如果您想知道总体代码如何访问DIContainer,那么您可以使用一个静态类来访问它,或者更合适的是,大多数DI框架都允许您创建一个DIContainer,实际上它的行为就像内部单例字典的包装器,它知道对于给定接口而言具体的类型。
这意味着,您可以在代码中的任何位置更新DIContainer,并有效地获得与您已配置的DIContainer相同的DIContainer,以了解您的界面与混凝土的关系。将DIContainer隐藏在不应直接与其交互的代码部分中的通常方法是,仅确保仅必要的项目具有对DI框架的引用。