如何在不持有Container对象的情况下通过Unity解析已注册的类型
解决方案
推荐方案:依赖注入构造函数注入,避免服务定位器反模式
这种方式完全不需要在业务代码中直接引用Unity容器实例,依赖关系透明,可测试性好。
步骤1:补充注册需要用到的类型
在Main方法的容器注册逻辑中,新增SampleUnitOfWork的注册:
var container = new UnityContainer(); container.RegisterType<IConnector, Connector>(); // 新增注册工作单元 container.RegisterType<SampleUnitOfWork>();
Unity会自动识别SampleUnitOfWork构造函数依赖的IConnector,后续解析时自动注入对应的实现。
步骤2:修改SampleDataSourceAccessor<T>,通过构造函数注入工作单元工厂
因为你需要在每次调用AddOrder时创建新的SampleUnitOfWork实例,Unity原生支持Func<T>类型的自动解析,不需要额外注册工厂类:
public class SampleDataSourceAccessor<T> where T : new() { private readonly Func<SampleUnitOfWork> _unitOfWorkFactory; // 构造函数注入工厂,Unity会自动传入可生成SampleUnitOfWork实例的委托 public SampleDataSourceAccessor(Func<SampleUnitOfWork> unitOfWorkFactory) { _unitOfWorkFactory = unitOfWorkFactory; } public void AddOrder(SampleOrderDto order) { // 直接调用工厂获取新实例,不需要手动new任何依赖 using (var unitOfWork = _unitOfWorkFactory()) { unitOfWork.DoSomething(); } } }
步骤3:确保SampleDataSourceAccessor<T>由容器解析生成
所有用到SampleDataSourceAccessor<T>的位置,不要手动new,改为从Unity容器解析,或者通过构造函数注入到上层类中,Unity会自动完成整个依赖链的构建。
不推荐备选方案:静态容器实例(服务定位器模式)
如果当前代码改造量太大,无法快速实现全链路依赖注入,可以临时用静态容器持有的方式解决,但该方案是反模式,会导致依赖不透明、单元测试难度提升,不建议长期使用:
- 定义静态容器持有类
public static class ContainerHolder { public static IUnityContainer Instance { get; set; } }
- 在Main方法注册完成后给静态属性赋值
var container = new UnityContainer(); container.RegisterType<IConnector, Connector>(); ContainerHolder.Instance = container;
- 在需要解析的位置直接使用静态容器
public void AddOrder(SampleOrderDto order) { using (var unitOfWork = ContainerHolder.Instance.Resolve<SampleUnitOfWork>()) { unitOfWork.DoSomething(); } }
内容的提问来源于stack exchange,提问作者egon-olsen
相关产品推荐
相关产品推荐

