2010-09-20 13 views
1

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?

Répondre

0

Je n'ai pas écrit beaucoup d'applications de bureau, mais le modèle le plus commun que je connaisse est de définir votre unité de travail sur un écran (comme un écran CRUD nouveau ou éditer par exemple). Il semblerait que votre application soit une forme unique, alors peut-être que vous êtes satisfait d'une seule unité de travail qui dure toute la vie de l'application. Puisque le DataContext ne possède pas de connexion ouverte à la base de données, cela ne devrait pas poser de problème.

L'autre option consisterait à utiliser une unité de travail par action de l'utilisateur (chaque clic de bouton obtient sa propre instance). Si vous décidez d'emprunter cet itinéraire, assurez-vous que votre unité de travail est enregistrée comme transitoire et gérez vous-même la durée de vie.

+0

Je pense que je pourrais aller avec 'action' alors que j'ai un écran .. et cet écran fait beaucoup de travail. –