首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法向Castle Windsor注册MvcMailer

无法向Castle Windsor注册MvcMailer
EN

Stack Overflow用户
提问于 2012-10-05 21:27:41
回答 2查看 1.2K关注 0票数 2

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

我从NuGet安装了这个包,并使用Scaffold命令生成了一个邮件程序,没有出现任何问题。我最终得到了一个包含UserMailerIUserMailer的新文件夹Mailers,以及一个位于Views下的UserMailer文件夹。

现在,我想在每次用户注册时发送一封电子邮件。所有涉及用户的操作都是由我的AccountController处理的,所以我想我应该修改它的构造函数来接受IUserMailer的一个实例。

不过,温莎城堡抱怨道。它说组件AccountController不能被创建,因为它对IUserMailer有一个等待满足的依赖。

我试着把它注册到

代码语言:javascript
复制
container.Register(Classes.FromThisAssembly()
                .BasedOn<IUserMailer>()
                .LifestyleTransient());

但是Windsor仍然抛出同样的异常。

我甚至尝试过注册它

代码语言:javascript
复制
container.Register(Component.For<IUserMailer>());

这会将错误更改为"IUserMailer是抽象的。因此,不可能将其实例化为服务IUserMailer的实现。您是否忘记了代理它?“

我想不出怎么让这玩意儿动起来。有人能帮上忙吗?

This comment说,MvcMailer与城堡温莎不兼容,这将是有点可悲。如果是这样的话,有没有办法绕过它呢?

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

EN

回答 2

Stack Overflow用户

发布于 2013-05-20 16:44:26

我刚让MVCMailer和城堡windsor 3.2一起工作

对于我的解决方案,我有一个独立的IOC项目,其中包含我的所有安装程序。在我的核心项目中,我创建了一个空的接口IMailer

代码语言:javascript
复制
public interface IMailer
{
}

然后,在搭建完一个邮件程序后,继承IMailer

代码语言:javascript
复制
public interface IAccountMailer : IMailer
{
     ...
}

这应该允许您一般注册所有的邮件到城堡温莎像这样。

代码语言:javascript
复制
container.Register(
    Classes.FromAssemblyNamed("MyDllName")
        .BasedOn<IMailer>().WithService.FromInterface()
        .LifestylePerWebRequest()
        );

然后你可以在你的控制器中做类似这样的事情

代码语言:javascript
复制
public class EmailController : ApiController
{
    private readonly IAccountMailer accountMailer;

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

只要你已经让你的城堡windsor创建了你的MVC和API控制器,它就应该能够创建你的邮件程序。

票数 1
EN

Stack Overflow用户

发布于 2013-06-27 15:15:46

到目前为止:

代码语言:javascript
复制
container.Register(Component.For<IUserMailer>().ImplementedBy<UserMailer>().Named("MailerService").LifeStyle.Transient);

虽然有报道称偶尔会出现空引用异常(就好像WhateverMailer不是由Windsor容器实例化的一样),但Windsor对我来说很有效。我还没有遇到过这种情况,但如果我遇到了,我将不得不离开容器,塞上我的鼻子,并在适用的控制器中重新启动邮件程序。如果你正在测试这个控制器,从你的链接参考:

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

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

虽然看起来@Neil有一个good solution as well

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12747292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档