5

次のように階層化された ASP.NET MVC3 を使用して構築された Web サイトがあります。

  • ProjectName.Shared (モデル + サービス契約)
  • プロジェクト名.インフラストラクチャ
  • プロジェクト名.データ
  • プロジェクト名.Data.Sql
  • ProjectName.Managers (ビジネス層)
  • ProjectName.Services (WCF サービス)
  • ProjectName.UI.Main (ASP.NET MVC3 アプリケーション)

これは実際に、いくつかのリファクタリングを経て最近思いついた構造です。残念ながら、UI と私のビジネス レイヤーは完全に分離されていないため、この領域ではさらにリファクタリングを使用できますが、締め切りが迫っているため、現時点では実行できません。

今のところ、私のクライアントは、いくつかのイベントが発生した後にユーザーに電子メールを送信することを含むいくつかの新機能を要求しています. ウェブサイトが現在メールを送信する方法は、これまでのところうまくいっている郵便ライブラリを使用することです. これは、新しい機能の場合とは異なる MVC Web アプリケーション内から発生します...

問題:

ユーザーにメールを送信するために、ビジネスレイヤー内のプライベートメソッドを許可する必要がある場合があります。Action メソッド内でこれを行うことができない理由は、最終的にこのプライベート メソッドを呼び出すことになるコード パスが多数あるためです。したがって、1 つの Action メソッドに固有のものではありません。

提案された解決策:

私が念頭に置いているのは、ビジネス層内から HTTP-POST 呼び出しを介してそのメソッドを呼び出すことができるEmailsControllerを作成することです。次に、Action メソッドの引数を使用して、電子メールの送信に必要なパラメーターを渡します。

しかし、私はこの解決策がちょっと欠陥があり、ハッキーだと思います。ですから、この問題にどのようにアプローチするかについて、いくつかの考えを聞きたいと思います。

4

1 に答える 1

0

メールロジックをサービスレイヤーやインフラストラクチャなどの背後にラップしてコントローラーから呼び出し、コンストラクターを介してサービスを注入することはできませんか?ビジネスレイヤーでも同じことをします。郵便オブジェクトがasp.netに継承するものを必要としない限り?

namespace ProjectName.Infrastructure
{
    public interface IEmailService
    {
        void SendEmail(string address, string content)
        {
        }
    }

    public class EmailService : IEmailService
    {
        private void SendEmail(string address, string content)
        {
            //...send email via Postal
        }
    }
}

public class ControllerA
{
    private IEmailService emailService;

    public ControllerA()
    {
        emailService = new EmailService();
    }

    public ActionResult SendEmail(ViewModel model)
    {
        emailService.SendEmail(model.address, model.content);
    }
}
于 2012-02-05T12:57:44.193 に答える