2012-10-05 3 views
2

MvcMailer을 ASP.NET MVC 4 앱에 통합하려고합니다.Castle Windsor에 MvcMailer를 등록 할 수 없습니다.

NuGet에서 패키지를 설치하고 아무런 문제없이 Scaffold 명령으로 메일러를 생성했습니다. 나는 UserMailerIUserMailer을 포함하고, UserMailer 폴더는 Views 아래에있는 새로운 폴더 메일러로 끝났다.

이제 사용자가 등록 할 때마다 이메일을 보내고 싶습니다. 사용자 관련 모든 작업은 AccountController에 의해 처리되므로 IUserMailer 인스턴스를 허용하도록 생성자를 변경했을 것입니다.

성 윈저는 불평합니다. 그것은 만족 기다리고 IUserMailer에 대한 의존성을 가지고 있기 때문에 구성 요소 AccountController 만들 수 없습니다 말합니다.

나는

container.Register(Classes.FromThisAssembly() 
       .BasedOn<IUserMailer>() 
       .LifestyleTransient()); 

에 등록을 시도했지만 윈저는 여전히 같은 예외가 발생합니다.

난 오류를 변경

container.Register(Component.For<IUserMailer>()); 

로 등록을 시도했습니다에 "IUserMailer, 서비스 IUserMailer의 구현으로 인스턴스화 할 수 없습니다 따라서. 추상적이다. 당신은 프록시 잊지 않았다 그것?"

나는이 일을하는 방법을 알아낼 수 없습니다. 누구든지 도울 수 있니?

This comment은 MvcMailer가 Castle Windsor와 호환되지 않는다고 말합니다. 다소 슬픈 일입니다. 그렇다면 그 문제를 해결할 수있는 방법이 있습니까?

이것은 바보 같은 질문 일 수 있습니다. 저는 윈저에 대해 거의 경험이 없습니다. 난 그냥 MVCMailer 내 솔루션의 성 윈저 3.2

작업있어 한

답변

1

내 모든 설치와 별도의 IOC 프로젝트가 있습니다. 모든 프로젝트에서 공유 내 핵심 프로젝트에서 나는 당신이 일반적으로 모든 우편물 등록이 당신을 허용해야 우편물을 스캐 폴딩 IMailer

public interface IAccountMailer : IMailer 
{ 
    ... 
} 

을 상속 한 후 IMailer

public interface IMailer 
{ 
} 

그런 다음 빈 인터페이스를 생성 성 윈저처럼.

container.Register(
    Classes.FromAssemblyNamed("MyDllName") 
     .BasedOn<IMailer>().WithService.FromInterface() 
     .LifestylePerWebRequest() 
     ); 

그런 다음 컨트롤러

public class EmailController : ApiController 
{ 
    private readonly IAccountMailer accountMailer; 

    public EmailController(IAccountMailer accountMailer) 
    { 
     this.accountMailer = accountMailer; 
    } 
} 

이 같은 작업을 수행 할 수 있습니다 그리고만큼 당신이 당신의 MVC와 API 컨트롤러를 만드는 당신의 성 윈저있어로 당신의 우편물을 만들 수 있어야합니다.

1

지금까지 :

container.Register(Component.For<IUserMailer>().ImplementedBy<UserMailer>().Named("MailerService").LifeStyle.Transient); 

...WhateverMailer가 Windsor 컨테이너에 의해 인스턴스화되지 않은 것처럼 null 참조 예외가 발생하는 경우도 있지만 보고서가 있지만 나를 위해 작동합니다. 아직이 문제가 발생하지 않았지만, 그렇게했다면 콘테이너 선에서 벗어나 코를 연결하고 해당 컨트롤러에서 새로운 우편물을 올려야합니다. 당신이 당신의 연결 기준에서 말했다 컨트롤러를 테스트하는 경우 :

을 나는 같은 내 테스트의 설정에서 수동으로 컨트롤러의 메일 서버를 재 할당 :

대상 = 새로운 컨트롤러 (...) {MailService 인터페이스 = MailServiceMock합니다. 개체};

@Neil은 good solution as well입니다.

관련 문제