2012-10-05 80 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

相关问题