Unity IOC容器:如何在容器创建作用域外解析实例?
解决Unity容器在其他类中解析对象的方法
首先先优化你当前的注册代码:你手动通过InjectionConstructor传递Resolve<RestClient>()是多余的,Unity会自动识别MyWrapperClass构造函数中的依赖并从容器中注入,所以可以简化成:
var myClient = new RestClient(); var iocContainer = new UnityContainer(); iocContainer.RegisterInstance(myClient); iocContainer.RegisterType<MyWrapperClass>(); // 无需手动传参,Unity自动注入RestClient
接下来针对你的问题,提供几种实用方案:
方案一:全局静态容器(最简单直接)
在WPF的App类中添加一个静态属性保存容器实例,让其他类可以直接访问:public partial class App : Application { public static IUnityContainer GlobalContainer { get; private set; } protected override void OnStartup(StartupEventArgs e) { var myClient = new RestClient(); GlobalContainer = new UnityContainer(); GlobalContainer.RegisterInstance(myClient); GlobalContainer.RegisterType<MyWrapperClass>(); base.OnStartup(e); } }之后在任意类中就可以这样获取实例:
MyWrapperClass wrapper = App.GlobalContainer.Resolve<MyWrapperClass>();注意:这种方式虽然简单,但会让类和容器产生耦合,适合快速验证,大型项目建议尽量少用。
方案二:构造函数注入(最符合IOC设计思想)
不要让类主动去获取容器,而是通过构造函数把需要的实例传递进去。比如你有一个MainViewModel需要使用MyWrapperClass,可以这样写:public class MainViewModel { private readonly MyWrapperClass _wrapper; // 通过构造函数注入依赖 public MainViewModel(MyWrapperClass wrapper) { _wrapper = wrapper; } public void ExecuteRequest() { // 直接使用注入的_wrapper,无需关心容器 _wrapper.SendRequest(); } }然后在创建
MainViewModel的时候,用容器解析(比如在窗口初始化时):// 在MainWindow构造函数中 public MainWindow() { InitializeComponent(); DataContext = App.GlobalContainer.Resolve<MainViewModel>(); }这种方式彻底解耦了类和容器,是IOC的核心用法,推荐优先使用。
方案三:服务定位器模式
可以使用Unity提供的ServiceLocator来统一获取实例,避免直接暴露全局容器:
首先需要引用Unity.ServiceLocator包,然后在OnStartup中注册:protected override void OnStartup(StartupEventArgs e) { var myClient = new RestClient(); var container = new UnityContainer(); container.RegisterInstance(myClient); container.RegisterType<MyWrapperClass>(); // 注册服务定位器 ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container)); base.OnStartup(e); }之后在其他类中获取实例:
MyWrapperClass wrapper = ServiceLocator.Current.GetInstance<MyWrapperClass>();注意:服务定位器本质还是全局访问,同样存在耦合问题,适合无法直接用构造注入的场景(比如某些遗留代码)。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

