2011-02-28 4 views
0

J'ai une situation où je suis dans mon accès aux référentiels sur mesure les services de domaine et je préférerais les ont injecté.Ninject avec Ria services (Custom DomainService)

I.e.

[EnableClientAccess()] 
    public class UserDomainService : DomainService 
    { 

    public IUserRepository repo; 

    public UserDomainService(IUserRepository userRepo) 
     : base() 
    { 
     repo = userRepo;    
    } 

    public IEnumerable<User> GetUsers() 
    { 
     return this.repo.GetUsers(); 
    } 

J'ai de nombreux services de domaine et ce que je ne suis pas sûr de est où définir un module Ninject de tenir mes fixations de type pour tous mes services de domaine et le charger dans le noyau. Je cherche un exemple simple pour démontrer comment je pourrais faire ceci.

+0

Je n'en ai vu aucun, mais je serais intéressé si vous en trouvez un. Pour l'instant, vous devriez être capable de créer un DomainServiceFactory personnalisé qui utilise Ninject. –

+0

@Kyle McClellan - une option que je ne pense était d'étendre la classe NinjectHttpApplication et définir les liaisons et le module dans le Global.asax. Cependant, je pense que je ne comprends pas bien comment/où fonctionnent ces DomainServices. Le code Global.asax fonctionnait correctement, mais IUserRepository dans le service de domaine personnalisé était toujours NULL lorsque le code ci-dessus était exécuté. Je suppose que cela me dit qu'ils ne fonctionnent pas dans le même contexte? Je pense que je peux prendre votre approche et aller avec l'usine ... –

Répondre

0

J'étais à droite suivi avec Ninject.Extensions.Web - extension du NinjectHttpApplication en place de la valeur par défaut Global.asax.

Cependant, cela ne fonctionne pas parce qu'il ne pas exposer le KernelContainer (accès à votre module Ninject nouvellement défini) de telle sorte que vous n'êtes pas en mesure d'injecter votre service de domaine personnalisé comme vous le feriez avec la classe de base de page, il fournit.

Alors ...

J'ai fini créé une classe similaire extension HttpApplication qui expose publiquement le noyau statique. Ensuite, j'ai créé un service de domaine de base dont tous mes services de domaine héritent. Dans le constructeur, je fais alors un appel pour injecter mon instance de service de domaine:

[EnableClientAccess()] 
    public class BaseDomainService : DomainService 
    { 
     public BaseDomainService() 
      : base() 
     { 
      MyCustomStaticKernelContainer.Inject(this); 
     } 
    } 
+0

Pourquoi n'avez-vous pas utilisé le DomainService.Factory? La méthode de CreateDomainService de IDomainServiceFactory (le type de retour de DomainService.Factory) est de savoir comment les services Ria l'instance de DomainService en interne, et elle est recommandée pour les utilisateurs de connecter le processus de création. Bonne réponse en cas de débordement de pile ici http://stackoverflow.com/questions/1294331/net-ria-services-domainservice-needs-a-parameterless-constructor. Bon exemple d'utilisation de DomainServices.Factory avec le conteneur AutoFac ici: http://code.google.com/p/autofac/wiki/RIAServices – JJS

Questions connexes