J'ai une méthode Update dans ma classe qui contient une instruction using pour créer une nouvelle instance de UnitOfWork, car j'envoie des emails de manière asynchrone et comme EF et DbContext ne sont pas thread safe doivent créer un nouveau dbContext pour chaque requête. J'ai utilisé Autofac pour DI dans mon UnitOfWork mais je ne sais pas comment utiliser mon nouveau constructeur UnitOfWork en utilisant statement pour m'assurer qu'il crée une nouvelle instance. Veuillez noter qu'il s'agit d'une application console. MerciAutofac DI dans Utilisation des instructions
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();
}
}
}
Mise à jour:
Je l'ai travailler avec la solution suivante cependant pas sûr si c'est le meilleur chemin
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 -> méthode de mise à jour
public void Update(tb_Email obj)
{
IUnitOfWork unitOfWork2;
using (unitOfWork2 = unitOfWorkFactory.create())
{
unitOfWork2.EmailRepository.Update(obj);
unitOfWork2.Commit();
}
}
Est-ce que 'ISMTPService' est juste un wrapper autour des frameworks' SmtpClient'? Si c'est le cas, sachez que vous ne pouvez pas envoyer plusieurs mails simultanément même avec les méthodes asynchrones, le code doit attendre que chaque appel/mail soit terminé avant d'en commencer un nouveau. En bref, si vous voulez utiliser cette librairie, il vaut mieux utiliser les méthodes synchrones. – Igor
Oui, ainsi qu'une méthode pour envoyer l'email et un événement. – user65248
Mais c'est exactement ce dont j'avais besoin et ça fonctionne bien. Le code envoie les e-mails au serveur et plus tard, il va augmenter et événement si l'envoi a été réussi ou non et sur la base de ce que j'utilise la méthode de mise à jour pour mettre à jour la base de données. – user65248