6

私は 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>();
4

2 に答える 2

7

UserService が IMailService を必要とし、MailService が IUserService を必要とする場合、依存ループが発生します。いくつかのオプションが表示されます。

  1. UserService はすぐに IMailService を必要としますか? メッセージを送信する必要があるときに渡していただけますか?

  2. リゾルバーをオンデマンドでクエリできますか。つまり、コンストラクターで IUserService を MailService に渡さず、必要なときに IUserService を解決するように MailService をコーディングしますか?

于 2012-05-17T15:50:30.233 に答える
5

Autofac has documentation on how to handle circular dependencies that might help here. You can get it to work if you follow the guidance there (which boils down to: make one of the dependencies a property rather than a constructor dependency).

于 2014-10-27T19:12:27.180 に答える