私はUnitOfWorkの新しいインスタンスを作成するusingステートメントを含むクラスのUpdateメソッドを持っています。これは電子メールを非同期的に送信していて、EFとDbContextはスレッドセーフではないからです各要求の新しいdbContext 私はUnitOfWorkでDI用にAutofacを使用しましたが、新しいインスタンスを作成するためにステートメントを使用する際に、新しいUnitOfWorkコンストラクタを使用する方法がわかりません。 これはコンソールアプリケーションであることに注意してください。 おかげAutofac DI inステートメントの使用
UnitOfWork.cs
public class UnitOfWork : IUnitOfWork
{
private IEventLoggerService MailCheckerLog;
private readonly BBEntities ctx = new BBEntities();
private IEmailRepository emailRepository;
public UnitOfWork(IEventLoggerService MaLog, IEmailRepository emailRepo)
{
emailRepository = emailRepo;
MailCheckerLog = MaLog;
}
public IEmailRepository EmailRepository
{
get
{
if (this.emailRepository == null)
{
this.emailRepository = new EmailRepository(ctx);
}
return emailRepository;
}
}
public void Commit()
{
try
{
this.ctx.SaveChanges();
}
catch (Exception e)
{
MailCheckerLog.log("Unit Of Work Exception => Commit() => " + e.Message.ToString(), EventLogEntryType.Error);
}
}
}
EmailService.cs
更新public class EmailService : IEmailService
{
private IUnitOfWork unitOfWork;
private IEventLoggerService MailCheckerLog;
private ISMTPService SMTPService;
public EmailService(IEventLoggerService Log, IUnitOfWork uOfWork, ISMTPService SMTPS)
{
unitOfWork = uOfWork;
MailCheckerLog = Log;
SMTPService = SMTPS;
SMTPService.OnMailSendComplete += new EventHandler(SendCompletedC);
}
public void Update(tb_Email obj)
{
IUnitOfWork unitOfWork2;
using (unitOfWork2 = new UnitOfWork())
{
unitOfWork2.EmailRepository.Update(obj);
unitOfWork2.Commit();
}
}
}
:私はそれが最善である場合はわからない、以下の溶液を用いて作業してしまった
方法
UnitOfWorkFactory.cs
public class UnitOfWorkFacotry : IUnitOfWorkFactory
{
private IUnitOfWork uow;
private IEmailRepository emailrepo;
private IEventLoggerService eventlog;
public UnitOfWorkFacotry(IEventLoggerService MaLog, IEmailRepository emailRep)
{
emailrepo = emailRep;
eventlog = MaLog;
}
public IUnitOfWork GetCurrent()
{
return uow ?? create();
}
public IUnitOfWork create()
{
return new UnitOfWork(eventlog, emailrepo);
}
}
EmailService.cs - > Updateメソッド
public void Update(tb_Email obj)
{
IUnitOfWork unitOfWork2;
using (unitOfWork2 = unitOfWorkFactory.create())
{
unitOfWork2.EmailRepository.Update(obj);
unitOfWork2.Commit();
}
}
'ISMTPService'は、フレームワーク' SmtpClient'の周りのラッパーですか?もし非同期メソッドでも同時に複数のメールを送信できないことがわかったら、コードは新しい呼び出しを開始する前に各呼び出し/メールが完了するのを待たなければなりません。要するに、このライブラリを使用する場合は、同期メソッドを使用する方がよいでしょう。 – Igor
はい、また、電子メールとイベントを送信する方法です。 – user65248
しかし、それは私が必要としていたもので、うまくいきます。コードは電子メールをサーバーに送信し、送信が成功したかどうかを確認し、更新メソッドを使用してデータベースを更新することを前提としています。 – user65248