2

저는 IoC를 처음 사용하고 현재 프로젝트에서 Autofac을 사용하고 있습니다. 'Autofac Circular Component Dependency Detected'오류

나는이 다음 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에 등록하는 방법입니다하십시오 UserService는 IMailService을 필요로하고 MailService 인터페이스는 종속성 루프를 IUserService을 필요로

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>(); 
+0

'IUserService'에서'MailService'가 필요로하는 메소드와'IMailService'에서'UserService'가 필요로하는 메소드를 설명 할 수 있습니까? 이와 같이 원형 종속성은 일반적으로 작은 리펙토링으로 인해 묵시적인 제 3의 개념을 명시 적으로 나타냅니다. –

+0

항상 그런 것은 아니지만 순환 종속성은 종종 디자인 결함을 나타냅니다. 더 많은 코드 (실제로'MailService'와'UserService'가하는 것)를 보여 주면, 우리는 이것이 사실인지와 이것을 고치는 방법을 알 수있을 것입니다. 아마도 당신은 다른 추상화를 놓치고 있습니다. – Steven

답변

4

합니다. 몇 가지 옵션이 있습니다.

  1. UserService에 IMailService가 필요한가요? 메시지를 보낼 필요가있을 때 전달할 수 있습니까?

  2. 필요에 따라 리졸버를 쿼리 할 수 ​​있습니다. 즉, IUserService를 생성자의 MailService로 전달하지 않고 필요할 때 IUserService를 확인하기 위해 MailService를 코딩 할 수 있습니까?

+0

안녕하세요 n8wrl. 내 UserService는 UserService 클래스 내의 첫 번째 또는 두 번째 메소드에서 IMailService 만 필요하며 UserService 클래스가 처음 인스턴스화되는 순간에는 필요하지 않습니다. 따라서 옵션 1을 염두에두고 메시지를 보낼 때만 전달할 때 가장 좋은 방법은 무엇입니까? – marcusstarnes

+0

글쎄, 당신의 'send-a-message'메쏘드는 IMailService 매개 변수를 취할 수도 있고, (옵션 2에서와 같이) AutoFaq의 해석기를 호출하여 하나를 얻은 다음 포기할 수도있다. – n8wrl

+0

필자는 테스트를 위해 다른 IMailService/IUserService 구현 (mock)을 바꿀 수 있기 때문에 개인적으로 # 2를 좋아하고, AutoFac은 그 (것)들을 행복하게 제공 할 것입니다. 또한 UserService 클라이언트가 IMailService를 전달하는 것에 대해 걱정할 필요가 없습니다. – n8wrl