Не уверенный, как использовать Внедрение зависимости + Шаблон Репозитория + Шаблон Единицы работы с приложением WinForm

(извинения за стену текста...:))

Сводка

Используя Внедрение зависимости с моим Winfor приложение создает большое количество Контекста Репозитория. Я не уверен, является ли способ, которым я использую это, правильным или неправильным, или какова обычная практика.

Подробнее

За прошлые 6 нечетных месяцев я делал ASP.NET приложениями MVC, которые реализуют шаблон O fWork Единицы с Шаблоном Репозитория. Вдобавок к этому я использовал Внедрение зависимости на всех этих веб-приложениях с некоторым успехом.

Таким образом, это - пример того, что я обеспечивал электричеством мой репозиторий.

public EntityFrameworkRepositoryRegistry() 
{ 
    For<IUnitOfWork>() 
            .HybridHttpOrThreadLocalScoped() // Lifecycle of the object.
            .Use<SqlServerContext>()  // My EF Context.
            .Ctor<string>("connectionString").Is("name=SqlServer_EF")
            .Ctor<string>("defaultContainerName").Is("Entities"); 

    // Ayende's EFProf application :) 
    EntityFrameworkProfiler.Initialize();      

    Scan(x => 
        { 
            x.TheCallingAssembly(); 

            x.ExcludeNamespaceContainingType<Fake.FakeContext>(); 

            x.WithDefaultConventions(); 
        } 
    );    
} 

Хорошо - работает отлично. Главное отметить вот это

  • Я предполагаю, что Жизненный цикл является корректным для веб-сценария.
  • Контекст будет только существовать однажды на ЗАПРОС, который поражает веб-сервер.

kewl.

Теперь, для моего приложения WinForm, я первоначально создал объект единицы работы (никакое внедрение зависимости, просто все же) и продолжал раздавать того ребенка во все службы (и затем в репозитории).

Для этого приложения победы это поражает DB для обнаружения всех текстовых файлов, которые это должно проанализировать. (например, 25 файлов). Затем для каждого файла это создает новый Синтаксический анализатор, читает каждую строку и зажимает проанализированные данные в таблицу базы данных. Прекрасный.

Проблема была, этот concext совместно использовался среди ВСЕХ Синтаксических анализаторов, который серьезно подбрасывал ошибки на всем протяжении магазина.

Таким образом я добавил некоторое Внедрение зависимости и использую тот код реестра выше. Вид того же самого - много серьезных ошибок. Это вызвано тем, что ОДИН контекст был снова создан для единственного потока-> winform.

Так, я теперь настроил Реестр Контекста к следующему:-

public EntityFrameworkRepositoryRegistry(bool isForTheWeb) 
{ 
    if (isForTheWeb) 
    { 
        For<IUnitOfWork>() 
            .HybridHttpOrThreadLocalScoped() 
            .Use<SqlServerContext>() 
            .Ctor<string>("connectionString").Is("name=SqlServer_EF") 
            .Ctor<string>("defaultContainerName").Is("Entities"); 
    } 
    else 
    { 
        For<IUnitOfWork>() 
            .Use<SqlServerContext>() 
            .Ctor<string>("connectionString").Is("name=SqlServer_EF") 
            .Ctor<string>("defaultContainerName").Is("Entities"); 
    } 

    EntityFrameworkProfiler.Initialize(); 

    Scan(x => 
    { 
        x.TheCallingAssembly(); 

        x.ExcludeNamespaceContainingType<Fake.FakeContext>(); 
        x.WithDefaultConventions(); 
    }); 
} 

Таким образом для приложения WinForm, это теперь не устанавливает Жизненный цикл. Это тогда создало приблизительно приблизительно 160 контекстов, я думаю! (Но это не сделало действительно ошибки, любого).

Так, я не уверен - ли это правильный способ сделать вещи.

Таким образом, мое приложение, в действительности, имеет 25 других движений таймеров, для проверки файла каждый.. сказать.. 10 secs. Если существуют новые данные, это синтаксические анализаторы это. Иначе возвратитесь в 10 secs.

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

Причина это имеет столько контекстов, becuase следующего кода... (и это отдельные Конструкторы для некоторых классов Репозитория...),

public SqlServerContext(string, string); 
public GameFileRepository (IUnitOfWork); 
public LogEntryRepository(IUnitOfWork); 
public AlertRepository(IUnitOfWork); 
... etc.. 

и для основного Сервиса...

public PunkBusterParser(IUnitOfWork, IGameFileRepositry, 
ILogEntryRepository, ILoggingService); 

таким образом, сервис требует UoW, и каждый репозиторий также требует того.. что означает, что новый становится созданным для каждого.

Я уверен, что не структурировал это правильно...

Любые предложения были бы искренне благодарны!

15
задан Mark Seemann 21 February 2010 в 07:49
поделиться

1 ответ

Эта статья Айенде может дать вам некоторое представление о том, как управлять единицей работы в настольном приложении (общая идея состоит в том, чтобы использовать сеанс на докладчика '): http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

3
ответ дан 1 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: