2

我正在尝试将MvcMailer集成到 ASP.NET MVC 4 应用程序中。

我从 NuGet 安装了该软件包,并使用该Scaffold命令生成了一个邮件程序,没有任何问题。我最终得到了一个包含UserMailerand的新文件夹Mailers IUserMailer,以及.UserMailerViews

现在,我想在每次用户注册时发送一封电子邮件。所有关于用户的操作都由 my 处理AccountController,所以我只是想我会改变它的构造函数来接受IUserMailer.

不过,温莎城堡抱怨道。它表示无法创建组件 AccountController,因为它依赖于等待满足的 IUserMailer。

我试图用它注册

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

但温莎仍然抛出同样的异常。

我什至尝试过注册它

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

将错误更改为“IUserMailer 是抽象的。因此,无法将其实例化为服务 IUserMailer 的实现。您是否忘记代理它?”

我不知道如何让这个东西工作。任何人都可以帮忙吗?

这条评论说 MvcMailer 与 Castle Windsor 不兼容,这会有些遗憾。如果是这种情况,有没有办法解决这个问题?

这可能是一个愚蠢的问题,我几乎没有温莎的经验。

4

2 回答 2

1

迄今:

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

...对我有用,尽管有报道称您偶尔会收到空引用异常(好像 WhatMailer 没有被 Windsor 容器实例化)。我还没有遇到过这种情况,但如果我遇到了,我将不得不远离容器,塞住我的鼻子,并在适用的控制器中重新安装邮件。如果您正在测试所述控制器,请从您的链接参考:

我在我的测试设置中手动重新分配我的控制器的邮件程序,如下所示:

目标 = 新控制器(...) { MailService = MailServiceMock.Object };

虽然看起来@Neil 也有一个很好的解决方案

于 2013-06-27T07:15:45.550 回答
1

我刚刚让 MVCMailer 与城堡温莎 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;
    }
}

只要你有你的城堡温莎创建你的 MVC 和 API 控制器,它应该能够创建你的邮件。

于 2013-05-20T08:44:25.960 回答