2012-10-05 81 views
2

我正在嘗試將MvcMailer整合到ASP.NET MVC 4應用程序中。不能在Castle Windsor註冊MvcMailer

我從NuGet安裝了軟件包,並用Scaffold命令生成了一個郵件程序,沒有問題。我結束了一個包含UserMailerIUserMailer的新文件夾Mailers以及Views下的UserMailer文件夾。

現在,我想每次用戶註冊時發送一封電子郵件。所有與用戶有關的操作都由我的AccountController處理,所以我只是想通過改變它的構造函數來接受IUserMailer的實例。儘管如此,溫莎城堡抱怨道。它說組件AccountController不能被創建,因爲它依賴於IUserMailer等待被滿足。

我試着

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

註冊,但仍溫莎拋出同樣的異常。

我甚至試圖與

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

這改變了錯誤登記爲「IUserMailer是抽象的。因此,它是不可能的實例作爲實施服務IUserMailer的。你忘了代理它?」

我想不出如何讓這個東西工作。任何人都可以幫忙

This comment說MvcMailer與溫莎城堡不兼容,這會讓人有點難過。如果是這樣的話,有沒有辦法解決這個問題?

這可能是一個愚蠢的問題,我幾乎沒有與溫莎的經驗。

回答

1

我剛剛拿到了MVCMailer與溫莎城堡3.2

工作對於我的解決方案我和我所有的安裝一個單獨的IOC項目。其中在所有項目中共享我的核心項目,我創建了一個空的接口IMailer

public interface IMailer 
{ 
} 

然後你腳手架後了mailer繼承IMailer

public interface IAccountMailer : 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容器實例化)。我還沒有遇到過這個問題,但如果我這樣做了,我將不得不離開容器的好處,插上我的鼻子,然後在適用的控制器中重新裝上郵件。如果您正在測試該控制器,從你的鏈接參考:

我手動重新分配我的控制器的梅勒在我的測試的設置爲這樣:

目標=新的控制器(...){MailService的= MailServiceMock。 Object};

雖然它看起來@Neil有good solution as well

相關問題