0

問題を複雑にしすぎたくはありませんが、このエラーに関連するすべてのコードを投稿する必要があると思います。

MvcMailerを使用し、別のSendメカニズムを導入しました (Orchard CMS 独自の EMail で使用するため)。

MvcMailer コード:

1) AskUsMailer.cs:

public class AskUsMailer : MailerBase, IAskUsMailer
{
    public AskUsMailer()
        : base()
    {
        //MasterName = "_Layout";
    }

    public virtual MvcMailMessage EMailAskUs(AskUsViewModel model)
    {
        var mailMessage = new MvcMailMessage { Subject = "Ask Us" };
        ViewData.Model = model;
        this.PopulateBody(mailMessage, viewName: "EMailAskUs");
        return mailMessage;
    }
}

2) IAskUsMailer.cs:

public interface IAskUsMailer : IDependency
{
    MvcMailMessage EMailAskUs(AskUsViewModel model);
}

3) AskUsController.cs: (以下の NULL 参照エラーを取得)

[Themed]
    public ActionResult Submitted()
    {
        //This is the new call (see new code below):
        //Note: Debugging steps through eMailMessagingService,
        //then shows the null reference error when continuing to
        //SendAskUs
        eMailMessagingService.SendAskUs(askUsData);
        //Below is normal MvcMailer call:
        //AskUsMailer.EMailAskUs(askUsData).Send();
        return View(askUsData);
    }

注: askUsData はコントローラーの別のブロックで定義されます。

    private AskUsViewModel askUsData;
    protected override void OnActionExecuting(ActionExecutingContext 
        filterContext)
    {
        var serialized = Request.Form["askUsData"];
        if (serialized != null) //Form was posted containing serialized data
        {
            askUsData = (AskUsViewModel)new MvcSerializer().
                Deserialize(serialized, SerializationMode.Signed);
            TryUpdateModel(askUsData);
        }
        else
            askUsData = (AskUsViewModel)TempData["askUsData"] ?? 
                new AskUsViewModel();
        TempData.Keep();
    }
    protected override void OnResultExecuted(ResultExecutedContext 
        filterContext)
    {
        if (filterContext.Result is RedirectToRouteResult)
            TempData["askUsData"] = askUsData;
    }

EMailMessagingService.cs (以下を参照) 呼び出しをコントローラーに取得する方法がわからなかったので、コントローラーの別のブロックでこれを行いました。

    private IEMailMessagingService eMailMessagingService;

    public AskUsController(IEMailMessagingService eMailMessagingService)
    {
        this.eMailMessagingService = eMailMessagingService;
    }

これは私の問題の一部だと思います。

ここで、Orchard の EMail にフックしようとする新しいコード:

1) EMailMessagingServices.cs:

public class EMailMessagingService : IMessageManager
{
    private IAskUsMailer askUsMailer;
    private IOrchardServices orchardServices;
    public EMailMessagingService(IAskUsMailer askUsMailer, 
        IOrchardServices orchardServices)
    {
        this.orchardServices = orchardServices;
        this.askUsMailer = askUsMailer;
        this.Logger = NullLogger.Instance;
    }

    public ILogger Logger { get; set; }

    public void SendAskUs(AskUsViewModel model)
    {
        var messageAskUs = this.askUsMailer.EMailAskUs(model);
        messageAskUs.To.Add("email@email.com");
        //Don't need the following (setting up e-mails to send a copy anyway)
        //messageAskUs.Bcc.Add(AdminEmail);
        //messageAskUs.Subject = "blabla";

        Send(messageAskUs);
    }
    ....
}

EMailMessagingService.cs には Send メソッドも含まれています。

    private void Send(MailMessage messageAskUs)
    {
        var smtpSettings = orchardServices.WorkContext.
            CurrentSite.As<SmtpSettingsPart>();

        // can't process emails if the Smtp settings have not yet been set
        if (smtpSettings == null || !smtpSettings.IsValid())
        {
            Logger.Error("The SMTP Settings have not been set up.");
            return;
        }

        using (var smtpClient = new SmtpClient(smtpSettings.Host, 
            smtpSettings.Port))
        {
            smtpClient.UseDefaultCredentials = 
                !smtpSettings.RequireCredentials;
            if (!smtpClient.UseDefaultCredentials &&
                !String.IsNullOrWhiteSpace(smtpSettings.UserName))
            {
                smtpClient.Credentials = new NetworkCredential
                    (smtpSettings.UserName, smtpSettings.Password);
            }

            if (messageAskUs.To.Count == 0)
            {
                Logger.Error("Recipient is missing an email address");
                return;
            }

            smtpClient.EnableSsl = smtpSettings.EnableSsl;
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;

            messageAskUs.From = new MailAddress(smtpSettings.Address);
            messageAskUs.IsBodyHtml = messageAskUs.Body != null &&
                messageAskUs.Body.Contains("<") && 
                messageAskUs.Body.Contains(">");

            try
            {
                smtpClient.Send(messageAskUs);
                Logger.Debug("Message sent to {0} with subject: {1}",
                   messageAskUs.To[0].Address, messageAskUs.Subject);
            }
            catch (Exception e)
            {
                Logger.Error(e, "An unexpected error while sending 
                    a message to {0} with subject: {1}", 
                    messageAskUs.To[0].Address, messageAskUs.Subject);
            }
        }
    }

現在、EMailMessagingService.cs で、実装されていないというエラーが発生していたので、次を自動生成しました (これがエラーの一部かどうかはわかりません)。

    public void Send(Orchard.ContentManagement.Records.ContentItemRecord recipient, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null)
    {
        throw new NotImplementedException();
    }

    public void Send(System.Collections.Generic.IEnumerable<Orchard.ContentManagement.Records.ContentItemRecord> recipients, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null)
    {
        throw new NotImplementedException();
    }

    public void Send(System.Collections.Generic.IEnumerable<string> recipientAddresses, string type, string service, System.Collections.Generic.Dictionary<string, string> properties = null)
    {
        throw new NotImplementedException();
    }

    public bool HasChannels()
    {
        throw new NotImplementedException();
    }

    public System.Collections.Generic.IEnumerable<string> GetAvailableChannelServices()
    {
        throw new NotImplementedException();
    }

2) IEMailMessagingServices.cs

public interface IEMailMessagingService
{
    MailMessage SendAskUs(AskUsViewModel model);
}

MvcMailer は、この追加がなくても (Orchard 外で) 正常に動作しますが、Orchard 内ですべてを動作させようとしています。

私は自分が間違っていることを理解できません。何かご意見は?

余計なコードすみません。

4

1 に答える 1

2

IEmailMessaginService は IDependency を実装していないため、Orchard によって依存関係として検出されません。それがヌルである理由です。

于 2012-11-25T22:32:05.810 に答える