跨项目DI实现:如何在项目B中使用项目A的IWorker?
解决方案
直接在项目B中仅注册IWorker和Worker不可行,因为Worker的构造函数依赖IDependency,DI容器实例化Worker时找不到对应实现,会抛出依赖缺失的异常。以下是几种可行的正确实现方式:
1. 项目A提供统一注册扩展方法
在项目A中封装一个扩展方法,打包IWorker及其所有依赖的注册逻辑,项目B只需调用该方法即可完成全部必要注册:
// 项目A中定义扩展方法 public static class WorkerServiceExtensions { public static IServiceCollection AddWorkerServices(this IServiceCollection services) { services.AddScoped<IDependency, SimpleDependency>(); services.AddScoped<IWorker, Worker>(); // 其他相关依赖的注册也可在此添加 return services; } }
项目B中调用:
services.AddWorkerServices();
这种方式让项目B无需关心IWorker的内部依赖细节,仅需一行代码完成注册。
2. 用工厂模式封装IWorker的创建
在项目A中实现一个工厂类,负责创建IWorker实例,项目B仅依赖工厂接口和IWorker接口:
// 项目A中定义工厂接口与实现 public interface IWorkerFactory { IWorker CreateWorker(); } public class WorkerFactory : IWorkerFactory { private readonly IDependency _dependency; public WorkerFactory(IDependency dependency) { _dependency = dependency; } public IWorker CreateWorker() { return new Worker(_dependency); } }
项目A中注册工厂:
services.AddScoped<IDependency, SimpleDependency>(); services.AddScoped<IWorkerFactory, WorkerFactory>();
项目B中使用:
public class SomeService { private readonly IWorker _worker; public SomeService(IWorkerFactory workerFactory) { _worker = workerFactory.CreateWorker(); } }
项目B只需注册工厂(或通过项目A的扩展方法注册),无需接触Worker的底层依赖。
3. 测试场景下使用Mock依赖
如果项目B是测试项目,可借助Mock框架(如Moq)模拟IDependency,手动创建Worker实例:
// 项目B测试代码 var mockDependency = new Mock<IDependency>(); // 配置Mock行为 mockDependency.Setup(d => d.SomeMethod()).Verifiable(); var worker = new Worker(mockDependency.Object); var someService = new SomeService(worker);
这种方式无需DI注册,适合快速验证SomeService与IWorker的交互逻辑。
4. 将IWorker封装为独立服务边界
若要彻底隔离IWorker的内部依赖,可将Worker及其依赖封装为独立服务(如gRPC、REST API),项目B通过调用外部服务来使用IWorker功能,而非直接依赖接口和实现类。
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

