6

我是 IoC 的新手,正在我当前的项目中使用 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>();
4

2 回答 2

7

如果一个 UserService 需要一个 IMailService 而一个 MailService 需要一个 IUserService 你有一个依赖循环。我看到了几个选项:

  1. 您的 UserService 是否立即需要 IMailService?当它需要发送消息时,您可以传递一个吗?

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

于 2012-05-17T15:50:30.233 回答
5

Autofac 有关于如何处理循环依赖的文档,这可能会有所帮助。如果您遵循那里的指导,您可以让它工作(归结为:使依赖项之一成为属性而不是构造函数依赖项)。

于 2014-10-27T19:12:27.180 回答