Вопрос по asp.net, dependency-injection – Ошибка «Обнаружена зависимость циклического компонента Autofac»

3

Я новичок в IoC и использую Autofac в моем текущем проекте.

У меня есть следующие 2 класса:

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>();
Можете ли вы описать методы, которыеMailService нуждается отIUserService а также чтоUserService нуждается отIMailService? Подобная круговая зависимость обычно приводит к небольшому рефакторингу, чтобы сделать явным подразумеваемую третью концепцию. Bryan Watts
Хотя это не всегда так, но круговая зависимость часто указывает на недостаток дизайна. Если вы показываете больше кода (чтоMailService а такжеUserService на самом деле), мы сможем сказать, так ли это, и как это исправить. Возможно, вам не хватает другой абстракции. Steven

Ваш Ответ

2   ответа
6

а для MailService - IUserService, у вас есть цикл зависимости. Я вижу пару вариантов:

Does your UserService need an IMailService right away? Could you pass one in when it needs to send a message?

Can either query the resolver on-demand - that is, don't pass IUserService to MailService in the constructor but rather code MailService to resolve IUserService when it needs it?

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded marcusstarnes
Error: User Rate Limit Exceeded marcusstarnes
Error: User Rate Limit Exceeded
3

Autofac имеет документацию о том, как обрабатывать циклические зависимости это может помочь здесь. Вы можете заставить его работать, если вы будете следовать там руководству (которое сводится к следующему: сделать одну из зависимостей свойством, а не зависимостью конструктора).

Похожие вопросы