You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不持有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会自动完成整个依赖链的构建。

不推荐备选方案:静态容器实例(服务定位器模式)

如果当前代码改造量太大,无法快速实现全链路依赖注入,可以临时用静态容器持有的方式解决,但该方案是反模式,会导致依赖不透明、单元测试难度提升,不建议长期使用:

  1. 定义静态容器持有类
public static class ContainerHolder
{
    public static IUnityContainer Instance { get; set; }
}
  1. 在Main方法注册完成后给静态属性赋值
var container = new UnityContainer();
container.RegisterType<IConnector, Connector>();
ContainerHolder.Instance = container;
  1. 在需要解析的位置直接使用静态容器
public void AddOrder(SampleOrderDto order)
{
    using (var unitOfWork = ContainerHolder.Instance.Resolve<SampleUnitOfWork>())
    {
        unitOfWork.DoSomething();
    }
}

内容的提问来源于stack exchange,提问作者egon-olsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:06:02