С приложением Windows (Winapp), когда / где я должен избавиться от моего UnitOfWork? - PullRequest
1 голос
/ 20 сентября 2010

У меня есть приложение для 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 ???

Есть идеи?

1 Ответ

0 голосов
/ 23 сентября 2010

Я не написал много настольных приложений, но самый распространенный шаблон, о котором я знаю, - это перенести вашу единицу работы на экран (например, на новый экран или окно редактирования CRUD).Похоже, что ваше приложение представляет собой единую форму, поэтому, возможно, у вас все в порядке с одной единицей работы, которая длится всю жизнь приложения.Поскольку DataContext не содержит открытого соединения с базой данных, это не должно быть проблемой.

Другой вариант - использовать единицу работы на действие пользователя (каждое нажатие кнопки получает собственный экземпляр).Если вы решите пойти по этому пути, убедитесь, что ваша единица работы зарегистрирована как временная, и управляйте временем жизни самостоятельно.

...