Question

Disons que j'ai la structure de classe suivante dans ma couche d'accès aux données:

interface IBehavior<in T>
{
  void Load(T model);
}

class ModelManager<T>
{
  ModelManager(IEnumerable<IBehavior<T>> behaviors) { ... }

  void Load(T model)
  {
    foreach (var behavior in behaviors) {
      behavior.Load(model)
    }
  }
}

Cela me laisse avoir différentes interfaces que mes modèles peuvent mettre en œuvre et les comportements réutilisables qui gèrent ces interfaces:

interface IUnique { ... }
class UniqueBehavior : IBehavior<IUnique>  { ... }

interface ITimestampable  { ... }
class TimestampableBehavior : IBehavior<ITimestampable> { ... }

Et le gestionnaire prendra plaisir à cause de ces contravariance dans IBehavior<T>.

class MyModel : IUnique, ITimestampable { ... }

new ModelManager<MyModel>(new IBehavior<MyModel>[] {
  new UniqueBehavior(),
  new TimestampableBehavior()
});

Super.

Mais maintenant, je veux que chaque comportement appliquer un ensemble de filtres LINQ à l'entité aussi. Ma première idée était d'ajouter cette méthode pour IBehavior<T>:

void ApplyFilters<IEnumerable>(ref IEnumerable<T> models)

... dans laquelle un comportement mise en œuvre s'appliquerait un ensemble de clauses de Where à l'énumération à sa discrétion.

Cependant, il se trouve, paramètres ref ne permettent pas variation de type. J'ai du mal à trouver un moyen de mettre en œuvre ce type de fonctionnalité tout en maintenant à la fois la sécurité de type et la nature contravariante de l'interface. Toutes les idées sont appréciés.

Était-ce utile?

La solution

Je ne sais pas si cela fonctionnerait dans votre contexte exact, mais avez-vous essayé de faire lui-même générique ApplyFolders?

void ApplyFolders<TEnum>(ref IEnumerable<TEnum> models) where TEnum : T;

Autres conseils

Je prendrais un coup d'œil à la Ptr de classe. J'ai pris avantage de cette classe récemment complètement buste toutes les limitations .NET met des mots-clés ref pour me laisser des effets secondaires des objets CLR pour une raison quelconque sent je n'ai pas le droit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top