四川城乡和住房建设厅网站,野望原文及翻译,沧州企业网站专业定制,网站设计策划书方案原文作者: Thomas Levesque 原文链接#xff1a;https://thomaslevesque.com/2020/03/18/lazily-resolving-services-to-fix-circular-dependencies-in-net-core/循环依赖的问题在构建应用程序时#xff0c;良好的设计应该应避免服务之间的循环依赖, 循环依赖是指某些组件直接… 原文作者: Thomas Levesque 原文链接https://thomaslevesque.com/2020/03/18/lazily-resolving-services-to-fix-circular-dependencies-in-net-core/循环依赖的问题在构建应用程序时良好的设计应该应避免服务之间的循环依赖, 循环依赖是指某些组件直接或间接相互依赖比如下面这样如果您不小心在.NET Core应用程序使用了依赖项注入并且引入了以下循环依赖关系你要知道的是项目启动会报一个循环依赖的错误因为依赖关系周期中涉及的组件的解析将失败比如你具有以下组件•A服务它实现了接口IA并取决于IB•B服务它实现了接口IB并取决于IC•C服务它实现了接口IC并取决于IASystem.InvalidOperationException: A circular dependency was detected for the service of type Demo.IA.所以应该去避免这些设计。注入 IServiceProvider但是当实际应用程序达到一定程度的复杂性时有时可能很难避免有一天不小心给服务添加了一个依赖项启动报错了事情突然浮出水面 因此您面临一个选择重构来解决循环依赖的问题理想情况下应该去选择重构但是实际情况中可能项目比较紧可能没有时间重构代码因为要做完整的回归测试。一种方法是将注入 IServiceProvider 到您的类中并services.GetRequiredService()在需要使用时使用T,例如C我前面提到的类,最初可能看起来像这样class C : IC
{private readonly IA _a;public C(IA a){_a a;}public void Bar(){..._a.Foo()...}
}
为了避免依赖性循环可以注入 IServiceProvider, 然后这样重写它class C : IC
{private readonly IServiceProvider _services;public C(IServiceProvider services){_services services;}public void Bar(){...var a _services.GetRequiredServiceIA();a.Foo();...}
}
由于在构建IA时不再需要解决问题C因此中断了循环至少在构建过程中并解决了问题但是我不太喜欢这种方法因为这样强制依赖了IOC如果我使用了 Autofac 等另一个问题是我很难看到类的依赖关系它不明显。巧用 LazyT下边的方法我利用了Lazy类需要添加一个 IServiceCollection 的扩展新建一个静态类public static IServiceCollection AddLazyResolution(this IServiceCollection services)
{return services.AddTransient(typeof(Lazy),typeof(LazilyResolved));
}private class LazilyResolvedT : LazyT
{public LazilyResolved(IServiceProvider serviceProvider): base(serviceProvider.GetRequiredServiceT){}
}
然后再 Startup.cs 中的 ConfigureServices 方法中这样写services.AddLazyResolution();
在依赖的类中IA注入Lazy当您需要使用时IA只需访问lazy的值 Value 即可class C : IC
{private readonly LazyIA _a;public C(LazyIA a){_a a;}public void Bar(){..._a.Value.Foo();...}
}
注意不要访问构造函数中的值保存Lazy即可 在构造函数中访问该值这将导致我们试图解决的相同问题。这个解决方案不是完美的但是它解决了最初的问题却没有太多麻烦并且依赖项仍然在构造函数中明确声明我可以看到类之间的依赖关系。最后欢迎扫码关注我们的公众号 【全球技术精选】专注国外优秀博客的翻译和开源项目分享也可以添加QQ群 897216102