У меня есть приложение для Windows, которое создает некоторые потоки для анализа некоторых текстовых файлов. Ничего слишком сумасшедшего.
Я использую инъекцию зависимостей StructureMap для создания любых экземпляров моих служб и репозиториев. Так что моя Winform имеет статическое свойство, которое возвращает экземпляр, основываясь на том, что было зарегистрировано. Прекрасно работает .. кроме того, я не уверен, когда я должен избавиться от моей единицы работы?
У меня есть один UnitOfWork на поток. Теперь потоки на самом деле не останавливаются. они продолжают тикать. Конечно, главное приложение Forms - это тоже собственный поток ... и это не остановится, пока вы его не убьете. Поэтому я не уверен, когда мне следует избавиться от UnitOfWork (который затем закрывает контекстное соединение).
Традиционно я занимался программированием веб-приложений (теперь ASP.NET MVC), поэтому могу распоряжаться в конце запроса ... и тот же UnitOfWork использовался в этом же запросе. Это хорошо работает ... Но нет запроса на завершение, в форме win :(
Есть идеи?
Вот код, объясняющий, что я делаю ...
Регистрация моих классов репозитория ...
public class EntityFrameworkRepositoryRegistry : Registry
{
public EntityFrameworkRepositoryRegistry(string connectionString)
{
For<IUnitOfWork>()
.HybridHttpOrThreadLocalScoped()
.Use<SqlServerUnitOfWork>()
.Ctor<string>("connectionString")
.Is(connectionString)
.Ctor<ILoggingService>("loggingService")
.Is(new NLogLoggingService(GetType().ToString()))
.SetProperty(x => x.EntityContainerName = "Entities");
EntityFrameworkProfiler.Initialize(); // Hi Ayende :) Love this :)
Scan(x =>
{
x.TheCallingAssembly();
x.ExcludeNamespaceContainingType<FakeContext>();
x.WithDefaultConventions();
}
);
}
}
и использование хранилища в Форме ... (да, это должен быть сервис, но я пока не абстрагировался, просто ...
private static IUserRepository GetUserRepository()
{
return ObjectFactory.GetInstance<IUserRepository>();
}
private void LoadUserInformation()
{
DisplayText("Reading in active users... ", false);
_users = GetUserRepository().Find().WhereIsActive().ToList();
DisplayText("done.", false, true);
DisplayText("Found " + _users.Count + " active users.");
}
.. теперь я могу просто вызвать Dispose (); после того, как я использую вызов ToList (), но тогда ничто другое не может использовать этот UnitOfWork ???
Есть идеи?