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

C#:如何向应用生命周期内仅实例化一次的类注入依赖的新实例?

解决单实例类每次请求获取新依赖实例的问题

你的场景非常适合用工厂模式来解决——既遵守单一职责原则、解除紧耦合,又能满足每次调用DoOperation时获取新SampleService实例的需求。下面是具体的实现方案:

步骤1:定义服务的工厂接口与实现

首先我们要把创建SampleService的职责剥离到专门的工厂类中,先定义抽象接口,再写具体实现:

// 定义工厂接口,依赖抽象而非具体实现
public interface ISampleServiceFactory
{
    SampleService Create();
}

// 具体工厂类,负责创建SampleService的新实例
public class SampleServiceFactory : ISampleServiceFactory
{
    public SampleService Create()
    {
        // 这里可以添加SampleService的初始化逻辑,比如传入它的依赖
        return new SampleService();
    }
}

如果你的依赖(比如你示例中的IEventLog)有多种类型需要创建,也可以给工厂方法加参数区分:

public interface ILoggerFactory
{
    IEventLog CreateLogger(string type);
}

public class LoggerFactory : ILoggerFactory
{
    public IEventLog CreateLogger(string type)
    {
        if (type == "Event")
            return new EventLog();
        // 可以扩展其他类型的创建逻辑
        return null;
    }
}

步骤2:修改单实例类,注入工厂并使用

由于工厂本身是无状态的,可以安全地通过构造注入到你的单实例SampleClass中——这样SampleClass只依赖工厂接口,每次调用DoOperation时通过工厂获取新的服务实例:

public class SampleClass // 应用生命周期内仅实例化一次
{
    private readonly ISampleServiceFactory _serviceFactory;
    // 如果是日志场景则注入ILoggerFactory
    // private readonly ILoggerFactory _loggerFactory;

    // 构造注入工厂(工厂由DI容器管理为单实例)
    public SampleClass(ISampleServiceFactory serviceFactory)
    {
        _serviceFactory = serviceFactory;
    }

    public void DoOperation() // 每个请求都会调用此方法
    {
        // 每次调用都获取新的SampleService实例
        var dependentService = _serviceFactory.Create();
        
        // 如果是日志场景:
        // var eventLog = _loggerFactory.CreateLogger("Event");
        
        // 执行业务操作...
    }
}

为什么这个方案可行?

  • 遵守单一职责原则:SampleClass不再负责创建依赖实例,专注于自身业务逻辑
  • 解除紧耦合:SampleClass只依赖抽象的工厂接口,而非具体的SampleService或工厂实现,单元测试时可以轻松Mock工厂返回模拟对象
  • 满足实例需求:工厂的Create方法每次调用都会生成新的服务实例,完美适配每次请求需要新实例的场景
  • 兼容DI容器:工厂可以通过DI容器注册为单实例,无需担心生命周期问题

内容的提问来源于stack exchange,提问作者ecma-402

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:07:53