本文介绍了(接口)检测到类型服务的循环依赖关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有2个界面:
public interface IPedidoService { UsuarioDrogueria CUsuarioDrogueria(string userId, int idDrogueria); List<PedidoComboProducto> CPedidosCombosProductos(int idcombo, int idPedido); } public interface IEmailService { void SendEmailAttachment(string email, string subject, string archive); void SendNotificationEmail(List<Pedido> pedidos, string email, Drogueria drog); void SendNotificationEmailADM(Pedido pedido) ; }我想使用 IPedidoService 中的 IEmailService 中的函数,因此在创建存储库时将其注入其构造函数中.
I want to use the functions from IEmailService inside IPedidoService, so I inject it in its constructor when I create the respository.
public class PedidoService : IPedidoService { private readonly IEmailService emailService; public PedidoService(IEmailService e) { this.emailService = e; } }到目前为止,一切正常,但是当我尝试反转角色时( IEmailService 中的 IPedidoService 函数):
Up until here everything works fine, but when I try to do reverse the roles (IPedidoService functions inside IEmailService):
public class EmailService : IEmailService { private readonly IPedidoService pedidoSettings; public EmailService(IPedidoService p) { this.pedidoSettings = p; } }我最终收到此异常:
System.InvalidOperationException: A circular dependency was detected for the service of type 'EnvioPedidos.Data.Abstract.IPedidoService'. EnvioPedidos.Data.Abstract.IPedidoService(EnvioPedidos.PedidoService) -> EnvioPedidos.Data.Abstract.IEmailService(EnvioPedidos.EmailService) -> EnvioPedidos.Data.Abstract.IPedidoService有人可以帮我在这里找到问题吗?
Can anybody help me trace the issue here?
推荐答案一种简单的方法是使用基于此博客:
A simple way is to use Lazy<T> class which is based on this blog:
自定义扩展方式:
public static class LazyResolutionMiddlewareExtensions { public static IServiceCollection AddLazyResolution(this IServiceCollection services) { return services.AddTransient( typeof(Lazy<>), typeof(LazilyResolved<>)); } } public class LazilyResolved<T> : Lazy<T> { public LazilyResolved(IServiceProvider serviceProvider) : base(serviceProvider.GetRequiredService<T>) { } }在Startup.cs中配置:
Configure in Startup.cs:
public void ConfigureServices(IServiceCollection services) { //services.AddSingleton<IPedidoService, PedidoService>(); //services.AddSingleton<IEmailService, EmailService>(); services.AddLazyResolution(); }更改您的农具类:
public class PedidoService : IPedidoService { private readonly Lazy<IEmailService> emailService; public PedidoService(Lazy<IEmailService> e) { this.emailService = e; } //... } public class EmailService : IEmailService { private readonly Lazy<IPedidoService> pedidoSettings; public EmailService(Lazy<IPedidoService> p) { this.pedidoSettings = p; } //... }更多推荐
(接口)检测到类型服务的循环依赖关系
发布评论