我正在尝试将MvcMailer集成到ASP.NET MVC4应用程序中。
我从NuGet安装了这个包,并使用Scaffold命令生成了一个邮件程序,没有出现任何问题。我最终得到了一个包含UserMailer和IUserMailer的新文件夹Mailers,以及一个位于Views下的UserMailer文件夹。
现在,我想在每次用户注册时发送一封电子邮件。所有涉及用户的操作都是由我的AccountController处理的,所以我想我应该修改它的构造函数来接受IUserMailer的一个实例。
不过,温莎城堡抱怨道。它说组件AccountController不能被创建,因为它对IUserMailer有一个等待满足的依赖。
我试着把它注册到
container.Register(Classes.FromThisAssembly()
.BasedOn<IUserMailer>()
.LifestyleTransient());但是Windsor仍然抛出同样的异常。
我甚至尝试过注册它
container.Register(Component.For<IUserMailer>());这会将错误更改为"IUserMailer是抽象的。因此,不可能将其实例化为服务IUserMailer的实现。您是否忘记了代理它?“
我想不出怎么让这玩意儿动起来。有人能帮上忙吗?
This comment说,MvcMailer与城堡温莎不兼容,这将是有点可悲。如果是这样的话,有没有办法绕过它呢?
这可能是一个愚蠢的问题,我几乎没有使用温莎的经验。
发布于 2013-05-20 16:44:26
我刚让MVCMailer和城堡windsor 3.2一起工作
对于我的解决方案,我有一个独立的IOC项目,其中包含我的所有安装程序。在我的核心项目中,我创建了一个空的接口IMailer
public interface IMailer
{
}然后,在搭建完一个邮件程序后,继承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;
}
}只要你已经让你的城堡windsor创建了你的MVC和API控制器,它就应该能够创建你的邮件程序。
发布于 2013-06-27 15:15:46
到目前为止:
container.Register(Component.For<IUserMailer>().ImplementedBy<UserMailer>().Named("MailerService").LifeStyle.Transient);虽然有报道称偶尔会出现空引用异常(就好像WhateverMailer不是由Windsor容器实例化的一样),但Windsor对我来说很有效。我还没有遇到过这种情况,但如果我遇到了,我将不得不离开容器,塞上我的鼻子,并在适用的控制器中重新启动邮件程序。如果你正在测试这个控制器,从你的链接参考:
我在我的测试设置中手动重新分配了控制器的邮件程序,如下所示:
目标=新控制器(...){ MailService = MailServiceMock.Object };
虽然看起来@Neil有一个good solution as well。
https://stackoverflow.com/questions/12747292
复制相似问题