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
相关产品推荐
相关产品推荐

