2010-10-11 14 views
0

Voici la configuration de base. Sur un site Web ASP.Net, quelques pages affichent des rapports à partir de données provenant d'une base de données. Toutes les données proviennent de procédures stockées auxquelles on accède en utilisant Linq to Sql. Ces pages peuvent avoir un trafic très élevé à des moments différents. Nous utilisons ASP.Net avec le modèle MVP et Unity for IoC (bien que cette question soit la même quel que soit le conteneur.) Chaque Presenter est injecté avec un IDataRepository qui est injecté avec un IDataAccess qui informe un Linq to Sql DataContext sous la hotte.Unité avec un Linq to Sql DataContext. RegisterType or RegisterInstance

La question est, lors du câblage du conteneur, devrions-nous utiliser RegisterInstance (singleton) pour IDataAccess, ou devrions-nous utiliser RegisterType. Je suppose que la question se résume à ceci: Comment Unity gère-t-il Dispose() (lors de l'utilisation de RegisterType, disposera-t-il correctement de ma classe DataAccess qui dispose de DataContext) et combien cela coûte-t-il de créer un DataContext. D'un autre côté, quelle est la réduction d'avoir des threads (potentiellement) multiples frappant le même DataContext?

Une note finale, pas sûr si cela est pertinent, le DataContext est utilisé strictement pour lire les données dans ce cas, il ne fait jamais d'écritures.

Répondre

3

En général, DataContext s ne sont pas thread-safe. Mais ils sont conçus pour être faciles à installer et à démonter, et sont légers. Vous devriez les considérer comme des unités de travail. En conséquence, vous devriez en utiliser un pour chaque "conversation" avec la base de données (vous seul pouvez décider ce qu'est une "conversation").

Par conséquent, je vous encourage fortement à ne pas définir le cycle de vie du DataContext comme singleton. De plus, si vous ne l'utilisez que pour faire des lectures, vous devez désactiver ObjectTrackingEnabled (similaire à IStatelessSession dans NHibernate).

+0

Exactement ce que j'avais besoin de savoir. Merci. – BFree

2

Il y a une différence entre Singleton et modèle Singleton Portée et la plupart des cadres DI y compris l'utilisation de UNITY Portée Singleton.

Singleton Portée: Un seul exemple existe par injecteur et c'est un concept très important car dans une application il peut y avoir plus d'un injecteur coexistant alors plus d'un singleton, dans ce cas chaque injecteur tiendra une instance différente du singleton objet tronqué.La plupart d'entre nous inclure moi croit que singleton signifie un exemple pour la vie d'une application, mais dans DI ce n'est pas le cas.

Il y a un très bon livre sur Dependecy Injection par Dhanji R. Prasanna.

+0

Je n'avais aucune idée, je pensais que c'était un vrai singleton, merci pour l'info! – BFree