У меня есть решение ASP.Net MVC3, запускающее процесс пакетного импорта, который извлекает данные из веб-службы.Для каждой строки / цикла процесс должен отправить до четырех электронных писем.Я хотел бы отключить эти письма в фоновых темах, чтобы основной поток не должен был ждать отправки писем.Дочерний поток электронной почты должен обновить таблицу аудита базы данных при завершении или сбое отправки электронной почты.
Проблема, с которой я сталкиваюсь, заключается в том, что я использую Unity для внедрения класса IEmailer в мой основной поток процесса, который также назначает текст данных «основной поток процесса» в класс emailer.Таким образом, я получаю сообщения об ошибках, когда текстовый текстовый текст уже закрыт, когда электронная почта пытается обновить таблицу аудита, если основной цикл уже завершен (вероятный сценарий).
Как сказать Unity назначить новый текстовый текст для моих новых потоков электронной почты, или как я могу указать моему классу электронной почты использовать другой контейнер для единства (я думаю, настроенный с помощью Transient datacontext)?)?
Вот мой урезанный код.(Я понимаю, что мог бы просто создать экземпляр 'new MyDataContext ()' внутри программы электронной почты, но определенно есть лучший способ).
Любая помощь, предложения, идеи или комментарии будут высоко оценены - спасибо!
Контейнер IOC
this.unityContainer = new UnityContainer()
.RegisterType<IDataProvider, DataProvider>()
.RegisterType(typeof(IEmailer), typeof(Emailer))
.RegisterType<DbContext, MyDataContext>(new HierarchicalLifetimeManager());
Класс импорта (основной поток)
public class DataSyncer : IDataSyncer
{
public DataSyncer(IDataProvider dataProvider, IEmailer emailer) {
this.dataProvider = dataProvider;
this.emailer = emailer;
}
public void Import(Guid key) {
// some import code
emailer.EmailAddress = "someone@somewhere.com";
emailer.Subject = "subject line";
new Thread(emailer.SendMail).Start(); // send email in new thread
}
}
Класс Emailer (для дочерних потоков)
public class Emailer : IEmailer
{
[Dependency]
public IDataProvider DataProvider { get; set; }
// etc
}
DataProvider (содержит datacontext через инъекцию ctor)
public DataProvider(MyDataContext context, // etc) { // etc }