(извинения за стену текста...:))
Используя Внедрение зависимости с моим 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, и каждый репозиторий также требует того.. что означает, что новый становится созданным для каждого.
Я уверен, что не структурировал это правильно...
Любые предложения были бы искренне благодарны!
Эта статья Айенде может дать вам некоторое представление о том, как управлять единицей работы в настольном приложении (общая идея состоит в том, чтобы использовать сеанс на докладчика '): http://msdn.microsoft.com/en-us/magazine/ee819139.aspx