1

Mvc.Unity4 も使用する MVC アプリケーション内で Postal を使用しようとすると、奇妙な問題が発生します。

へのアクセスがないために問題が発生したと思いますHttpContext

Postal を使用して、コントローラーの 1 つからメールを送信しようとしています。

dynamic e = new Email("AccountActivation");
e.To = "name@email.com"
e.Send();

電子メールを送信しようとすると、 内で次の例外が発生しますUnity.Mvc4.UnityDependencyResolver:

[NullReferenceException: Object reference not set to an instance of an object.]
   Unity.Mvc4.UnityDependencyResolver.get_ChildContainer() +57
   Unity.Mvc4.UnityDependencyResolver.GetService(Type serviceType) +241
   System.Web.Mvc.DefaultViewPageActivator.Create(ControllerContext controllerContext, Type type) +87
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +216
   Postal.EmailViewRenderer.RenderView(IView view, ViewDataDictionary viewData, ControllerContext controllerContext, ImageEmbedder imageEmbedder) +182
   Postal.EmailViewRenderer.Render(Email email, String viewName) +204
   Postal.EmailService.CreateMailMessage(Email email) +72
   Postal.EmailService.Send(Email email) +65

これは別の開発者によって追加されたため、Mvc.Unity4 にはあまり詳しくありません。

ストローをつかんで、Application_Start 内に正しい Postal タイプを登録しようとしました。Unity コンテナの初期化は次の場所で行われていBootstrapper.csます:

container.RegisterType<UsersController>(new InjectionConstructor());
container.RegisterInstance<IEmailService>(new EmailService());

私のコントローラー内には、次のものがあります。

private IEmailService _emailService;
public UsersController()
{
    _emailService = new Postal.EmailService();
}

public UsersController(Postal.EmailService emailService)
{
    _emailService = emailService;
}

[HttpPost]
public async Task<ActionResult> SendEmail(EmailViewModel viewModel)
{
     dynamic e = new Email("AccountActivation");
     e.ViewData.Add("To", "name@email.com");
     e.ViewData.Add("From", "no-reply@email.com");
     _emailService.Send(e);

     More code...
}
4

2 に答える 2

0

あなたの疑いは正しいと思います。HttpContextアプリケーションの初期化中は使用できません。ControllerContextしたがって、イベントでは Postal は機能しません ( andに依存しているためViewContext) Application_Start

DI を使用しているため、これは Unity を使用して構成されたすべてのクラスのコンストラクターにも拡張されます。コンストラクターで Postal を使用することはできませんが、Application_Start完了後に呼び出されるメソッドでは使用できます。

Postal への呼び出しを外部に移動するApplication_Startか、この 1 つのケースではネイティブ .NET メール ライブラリを使用する必要があります (これらは System.Net に依存しており、.NET に依存していないためHttpContext)。

于 2015-02-05T20:02:44.177 に答える
0

自分の質問に答えて申し訳ありませんが、ようやくこれを機能させることができました。

メソッドからを削除するasyncと、すべてが期待どおりに機能し始めました。

だから変えることで…

public async Task<ActionResult> SendEmail(EmailViewModel viewModel)

これに...

public ActionResult SendEmail(EmailViewModel viewModel)

その後、内部で例外をトリガーせずにメールを送信できましたUnity.Mvc4.UnityDependencyResolver.get_ChildContainer()

.Send()メソッド内からPostal を呼び出すことができなかった理由がわかりません(補足として、同じ Unity の問題が発生しasyncて呼び出しを試みました)。.SendAsync()メソッド内でこれが機能する理由を誰かが明らかにするasyncことができれば、それは大歓迎です。

ありがとう。

于 2015-02-08T17:03:39.140 に答える