5

J'ai obtenu des classes statiques avec des méthodes d'extension qui ajoutent la «logique métier» aux entités utilisant le modèle de référentiel.Comment injecter ninject lui-même dans une classe statique avec des fonctions d'extension

Maintenant, j'ai parfois besoin de créer un nouveau IRepository dans ces fonctions d'extension.

Je travaille actuellement autour en accédant à mon noyau Ninject à travers l'objet que je suis d'extension, mais il est vraiment moche:

public static IEnumerable<ISomething> GetSomethings(this IEntity entity) 
{ 
    using (var dataContext = entity.kernel.Get<IDataContext>()) 
     return dataContext.Repository<ISomething>().ToList(); 
} 

Je pourrais aussi faire un constructeur statique, l'accès au noyau Ninject en quelque sorte de une usine, y a-t-il déjà une infrastructure pour cela dans Ninject 2?

Est-ce que quelqu'un connaît une meilleure solution? Quelqu'un a-t-il des commentaires sur cette façon de mettre en œuvre la logique métier?

Répondre

4

Sur la question des méthodes d'extension et comment elles obtiennent des choses. Vous avez deux approches:

  1. Service de Location - ont un noyau global et descendre à Service Lieu (qui est différent de l'injection de dépendance). Le problème ici est bien que votre entité (ou ses extensions) ne devraient pas être assumer son contexte et plutôt exigeant qu'il

  2. Comme vous êtes une méthode d'extension avez la chose que vous étendons vous passe ce que vous avez besoin

Comme vous l'avez plus ou moins deviné, ceci (le fait d'avoir un noyau global qui devient le dépotoir) est quelque chose que Ninject essaie de vous dissuader. En général, l'extension pour tout ce que vous utilisez (par exemple, MVC ou WCF) fournira quelque chose si c'est approprié. Le problème majeur ici est que les dépendances de ce type ne devraient probablement pas se propager au niveau de l'entité - elles devraient rester au niveau du service et être propagées à partir de là (en utilisant le vocabulaire DDD).

Vous trouverez peut-être this answer by me intéressante car elle couvre ce terrain un peu (plus d'une des techniques ninject qu'une perspective de concepts architecturaux)

+0

Merci pour votre réponse. Je ne suis pas très friand de l'emplacement de service non plus, à mon avis c'est encore plus laide ce que je fais maintenant. Je vais aller avec le plus gros problème ici, que ce n'est pas le bon endroit pour ajouter une logique métier. J'espérais qu'il y avait un moyen magique d'injecter un constructeur statique. Donc, je pourrais garder mon design et ne pas le rendre trop moche. Je vais laisser la question ouverte pendant encore quelques heures et si aucun génie AOP ne se présente, j'accepterai votre réponse! – JJoos

+0

Vous ne trouverez pas de génies ici - juste des gens qui traquent des réponses sur les forums - ils sont tous sur la liste de diffusion Ninjecxt: D Bottomlin est pour les méthodes statiques [comme les méthodes d'extension], qu'il n'y a pas de contexte ou d'opportunité intercepter de toute manière facile. Il est possible de faire circuler le contexte dans l'Entité au moment de «nouveau» de diverses manières (NHibernate et L2S ont chacun leurs propres moyens). Le problème est que vous ne voulez pas que les entités prennent les choses en main et courent dans d'autres dépôts. Et l'efficacité en souffrira également - à moins que vous ne suiviez une route semblable à Hiro. –

+0

Le livre Evans DDD (un incontournable à lire absolument, peu importe ce que vous faites, même si cela vous fait mal la tête pour l'absorber) et/ou http://thinkddd.com/ vous aidera à réfléchir à votre conception globale ici .Si vous cherchez vraiment des trucs AOP lourds, vous trouverez cela dans le sens de PostSharp. –

Questions connexes