J'ai une application Windows qui crée des threads pour analyser certains fichiers txt. Rien de trop fou. J'utilise l'injection de dépendances StructureMap pour créer des instances de mes services et référentiels. Donc, mon Winform a une propriété statique qui renvoie l'instance, en fonction de ce qui a été enregistré. Fonctionne bien .. sauf que je ne suis pas sûr quand je devrais disposer de mon unité de travail?Avec une application Windows (winapp) quand/où devrais-je disposer de mon UnitOfWork?
J'ai un seul UnitOfWork par thread. Maintenant, les threads ne s'arrêtent pas vraiment. ils continuent à tiquer. Bien sûr, l'application principale Forms est aussi son propre thread, et cela ne s'arrête pas tant que vous ne le tuez pas. Donc, je ne suis pas sûr quand je devrais me débarrasser de UnitOfWork (qui ferme alors la connexion de contexte).
Traditionnellement, j'ai fait de la programmation d'applications web (ASP.NET MVC maintenant) afin que je puisse disposer à la fin de la requête ... et le même UnitOfWork a été utilisé tout au long de cette même requête. Cela fonctionne bien ... Mais il n'y a pas fin demande, dans une WinForm :(
Toutes les idées?
est ici un code pour expliquer ce que je fais ...
Enregistrement mes cours du référentiel ...
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();
}
);
}
}
et en utilisant le référentiel dans le formulaire ... (oui, cela devrait être un service, mais je l'ai pas étendu que, juste encore ...
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.");
}
.. maintenant je peux simplement appeler Dispose(); après que j'utilise appel ToList() mais alors rien d'autre ne peut utiliser ce UnitOfWork ???
Des idées?
Je pense que je pourrais aller avec 'action' alors que j'ai un écran .. et cet écran fait beaucoup de travail. –