J'ai ce qui pourrait être vu comme un hybride bizarre de IQueryable<T>
et IList<T>
collections d'objets de domaine transmis ma pile d'applications. J'essaie de maintenir le plus possible le «chargement tardif» ou le «chargement paresseux». Je fais cela de deux façons:Comment puis-je tester ou tester mes fonctionnalités d'évaluation/d'exécution différées?
- En utilisant une couche de données LinqToSql et en passant à travers
IQueryable<T>
s par les dépôts et à ma couche d'application. - Ensuite, après que ma couche d'application passe
IList<T>
s, mais où certains éléments dans le graphe d'objet/agrégat sont 'chained' with delegates afin de différer leur chargement. Parfois même le contenu du délégué dépend des sourcesIQueryable<T>
et lesDataContext
sont injectés.
Cela fonctionne pour moi jusqu'à présent.
Ce qui est difficile, c'est de prouver que cette conception fonctionne réellement. C'est à dire. Si je défais la partie «fainéante» quelque part et que mon évaluation/exécution se passe tôt alors le tout est une perte de temps. Je voudrais être en mesure de TDD en quelque sorte.
Je ne connais pas grand-chose aux délégués ou à la sécurité des threads dans la mesure où elle s'applique aux délégués agissant sur la même source. Je voudrais être en mesure de se moquer du DataContext
et en quelque sorte tracer les deux méthodes de différer (IQueryable<T>
SQL et les délégués) le chargement afin que je puisse avoir des tests qui prouvent que les deux fonctions fonctionnent à différents niveaux/couches de l'application /empiler. Comme il est crucial que le différé fonctionne pour que le design ait une quelconque valeur, j'aimerais voir les tests échouer quand je casse le design à un niveau donné (séparé de l'implémentation en direct). Est-ce possible?
Cela ressemble à un début. Que diriez-vous quand j'ai un 'LazyItem' qui utilise des délégués pour déclencher l'évaluation de l'élément encapsulé? http: // stackoverflow.com/questions/1669607/is-this-repository-pattern-efficace-with-linq-to-sql/1695561 # 1695561 –
@cottsak: Vous pouvez définir le délégué comme étant un délégué de rupture (un délégué qui déclenche une exception). –
Cela semble être une bonne idée. Peut-être que j'étais après une solution plus complexe quand ce n'était pas nécessaire. –