0

データベースから電子メールのリストを取得し、60秒ごとに.netメールを使用して送信するWindowsサービスを実装しました。 私はリポジトリパターンを使用して設計しました。ソリューションのフォルダとプロジェクトのスクリーンショットをご覧ください。 Click to see the pictureEF6 Windowsサービスのリポジトリパターン

質問:パターンの面では

  1. 私は正しい軌道に乗っていますか?各リポジトリのインタフェースとリポジトリごとのサービスを作成します。
  2. ビジネスロジックの中にはデータベースとは関係がないものもありますが、依然としてリポジトリを作成する必要がありますか、サービスで十分ですか?
  3. 私は電子メールを送信してメールを送信しているSMTPサービスクラスを持っていますが、データベースを更新する必要がある各メールを送信していますが、SMTPサービスクラスに更新ロジックを入れるかどうか良い練習ですか?それは私はあなたが正確にどのようなビジネスあなたが持っている要件を達成したいのかわからないんだけど

    public class SMTPService : ISMTPService 
        { 
    
         SmtpClient client; 
         MailMessage newMessage; 
         EmailService emailService; 
         IEventLoggerService MailCheckerLog; 
    
         public async Task SendEmail(tb_Email email) 
         {...} 
    
         void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e, tb_Email email) 
         { 
    
          if (e.Cancelled) 
          { 
    
          } 
          if (e.Error != null) 
          { 
    
          } 
          else 
          { 
           email.DateSent = DateTime.Now; 
           emailService.Update(email); 
          } 
    
          client.Dispose(); 
          newMessage.Dispose(); 
    
         } 
    

    }

答えて

0

以下のようなものです。

構造は今のところ問題ありませんが、ユーザーエンティティと写真エンティティがあります。各ユーザーには写真が関連付けられている必要があります。あなたはそのシナリオをどのように扱いますか?

UserRepositoryとPhotoRepositoryを作成する必要があります。あなたが最初に写真記録が後でそれを参照するためには、ユーザ記録を挿入しなければならない。 したがって、UserRepositoryのInsert()メソッドを呼び出します。ユーザーが挿入されると、PhotoRepositoryのInsert()メソッドを呼び出します。しかし、もしInsert()が失敗すればどうなるでしょうか?これで、dbを持つユーザーが写真を持っていません。

ユーザーと写真を1つのトランザクションで一緒に挿入する必要があります。それが作業パターンの単位です。複数のエンティティタイプに関係するビジネスロジックがある場合は、それを使用する必要があります。メールを処理するだけであれば、これは問題ありません。そうでない場合は、そのパターンをアプリケーションに追加する必要があります。例hereを参照してください。

サービスは、ビジネストランザクションを処理するものであり、ビジネストランザクションは複数のタイプのエンタテイに触れることができます。繰り返しますが、作業単位パターンはこれを手助けすることができます。しかし、通常はリポジトリは、あなたのビジネスロジックに基づいて、エンタテイメントとサービスに基づいて作成されます。この例では、UserRepositoryとPhotoRepositoryの両方を使用するUserServiceを(通常は作業ユニットを通じて)使用できます。

電子メールを送信する場合は、ビジネスロジックに基づいてサービスを再設計します。そしておそらくビジネスロジックは「電子メールを送信する」ことであり、「SMTP経由で電子メールを送信する」ことではない。 SendGridのようなサービスを使用することに決めた場合はどうなりますか?その後、SMTPServiceではなくなります。

私はおそらくEmailService(あなたも持っている)を作成し、これはSendEmails()メソッドを持つでしょう。これは、EmailRepositoryを使用して電子メールを取得し、SMTPを使用して送信し、それを更新し、作業単位を通じて保存します。

本当に抽象化したい場合は、SendEmail(Email email)という1つのメソッドでIEmailSenderServiceインターフェイスを作成できます。次に、このインターフェイスを実装し、SmtpClientクラスをラップし、SMTPを使用して電子メールを送信するSmtpEmailSenderServiceを作成できます。 SendGridに移動する場合は、HttpClientを使用してSendGridにリクエストを発行するSendGridEmailSenderServiceを作成できます。更新はリポジトリと作業ユニットを使用してEmailServiceで行われますが、EmailService自体はSmtpClientではなく単にIEmailSenderServiceインタフェースを使用します。

+0

返信いただきありがとうございます。メールは1つだけです。私はまだUOWが必要ですか?私たちが複数のエンティティを持っているときに役に立ちました。 – user65248

+0

エンティティが1つだけの場合は、その必要はありません。 –

+0

現在、私はSendMailAsyncを使って電子メールを送信し、SendCompleteイベントが発生したときにデータベースの更新を処理しています。 1つのバッチで100以上の電子メールを送信しているので、次の電子メールが処理される前にSendCompleteが起動されないことがあります。dbcontextのusingステートメントで更新メソッドをラップすることによって、 (BBEntities db = new BBEntities()) { db.Entry(obj).State = EntityState.Modified; db.SaveChanges(); } – user65248

関連する問題