(接口)检测到类型服务的循环依赖关系 [英] (Interface) A circular dependency was detected for the service of type

查看:114
本文介绍了(接口)检测到类型服务的循环依赖关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有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;
    }
    //...
}

这篇关于(接口)检测到类型服务的循环依赖关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆