Asp.net ';检测到Autofac循环组件依赖关系';错误

Asp.net ';检测到Autofac循环组件依赖关系';错误,asp.net,dependency-injection,inversion-of-control,ioc-container,autofac,Asp.net,Dependency Injection,Inversion Of Control,Ioc Container,Autofac,我是国际奥委会的新手,目前正在我的项目中使用Autofac 我有以下两门课: public class UserService : IUserService { private readonly IUserRepository _repo; private readonly IMailService _mailService; public UserService(IUserRepository repo, IMailService mailService) {

我是国际奥委会的新手,目前正在我的项目中使用Autofac

我有以下两门课:

public class UserService : IUserService
{
    private readonly IUserRepository _repo;
    private readonly IMailService _mailService;
    public UserService(IUserRepository repo, IMailService mailService)
    {
        _repo = repo;
        _mailService = mailService;
    }
}

public class MailService : IMailService
{
    private readonly IMailRepository _repo;
    private readonly IUserService _userService;
    public MailService(IMailRepository repo, IUserService userService)
    {
        _repo = repo;
        _userService = userService;
    }
}
起初,我的UserService类不需要MailService类的实例,但现在它需要,自从将其引入UserService构造函数之后,出现了这个循环依赖错误,作为一个新手,我不确定如何解决这个问题

这是我的类当前在Autofac中注册的方式:

var builder = new ContainerBuilder();

// controllers                      
builder.RegisterControllers(Assembly.GetAssembly(typeof(UsersController)));

// register other classes
builder.RegisterType<UserRepository>().As<IUserRepository>();
builder.RegisterType<MailRepository>().As<IMailRepository>();
builder.RegisterType<UserService>().As<IUserService>();
builder.RegisterType<MailService>().As<IMailService>();
var builder=newcontainerbuilder();
//控制器
builder.registercontroller(Assembly.GetAssembly(typeof(userscoontroller));
//注册其他课程
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();

如果UserService需要iMail服务,而MailService需要IUserService,则有一个依赖项循环。我看到了几个选择:

  • 您的用户服务是否需要立即提供iMail服务?当它需要发送消息时,你能把它传进来吗

  • 可以按需查询解析程序-也就是说,不要在构造函数中将IUserService传递给MailService,而是在需要时编写MailService来解析IUserService


  • 这可能会有帮助。如果您遵循那里的指导(归结起来就是:使其中一个依赖项成为属性而不是构造函数依赖项),就可以让它工作。

    Hi n8wrl。我的UserService只需要UserService类中一个或两个方法的IMailService,而不是在UserService类第一次实例化时立即使用。因此,考虑到选项1,只有在我需要发送消息时才传入一个消息的最佳方法是什么?好的,您的“发送消息”方法可以采用IMailService参数,或者(如选项2所示)它可以调用AutoFaq的解析器获取一个,然后放弃?我个人喜欢#2,因为我可以在不同的IMailService/IUserService实现(mock)中交换以进行测试,并且,在适当的配置下,AutoFac将很乐意为它们提供服务。它还可以防止您的UserService客户端担心传入iMail服务。您如何解决随需应变的问题,相信我也遇到过同样的情况,我尝试过实现选项2,但得到了解决“无法使用可用的服务和参数调用在类型上具有'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'的构造函数:无法解析参数。”。“您能否概述
    MailService
    需要从
    IUserService
    获取的方法,以及
    UserService
    需要从
    IMailService
    获取的内容?”?像这样的循环依赖通常会导致一个小的重构,以明确一些隐含的第三个概念。虽然不总是这样,但循环依赖通常表明设计缺陷。如果您显示更多的代码(实际执行的是
    MailService
    UserService
    ),我们将能够判断是否存在这种情况,以及如何修复这种情况。可能您缺少了另一个抽象概念。