2009-08-07 6 views
2

Comment lier mon interface à une classe concrète dans un assemblage différent?Liaison Ninject

Je les projets suivants dans ma solution:

Foo.Data
Foo.Domain

Dans la structure Plan ajouter mes deux noms d'assemblage au fichier StructureMap.config et en utilisant ensuite la PluginFamily et les attributs Pluggable mappent mes interfaces à ma classe concrète '.

Comment peut-on accomplir la même chose avec Ninject?

+0

Les projets de la solution contiennent-ils à la fois les interfaces et les classes concrètes? Cherchez-vous à les lier dans une solution ou un projet consommateur ou dans cette solution? –

+0

Aussi, quelle version de Ninject utilisez-vous? –

+0

@Peter L'interface est dans mon domaine et les classes concrètes dans la couche de données. Je cherche juste à lier dans la solution. Je considère également au lieu de séparer le domaine et la couche de données par projet pour le faire dans des dossiers séparés dans le même projet. J'utilise Ninject 1.0 pour le framework compact. –

Répondre

6

Je vais faire quelques hypothèses ici.

  1. Vous avez une interface nommée IBar dans votre projet Foo.Domain et vous avez une classe concrète appelée BarClass dans votre projet Foo.Data.
  2. Vous faites en fait référence au projet Foo.Domain dans votre projet Foo.Data car BarClass implémente IBar.

La chose la plus simple à faire avec Ninject est de créer une nouvelle classe dans Foo.Data qui dérive de la StandardModule de Ninject:

internal class BarModule : StandardModule { 
    public override void Load() { 
    Bind<IBar>() 
     .To<BarClass>(); 
    } 
} 

Cette classe établit alors la liaison pour les demandes de IBar à la classe concrète de BarClass. Ceci est votre équivalent XML.

L'étape suivante consiste à créer le noyau Ninject (un "conteneur") et à fournir ce module (c'est-à-dire cette configuration). Là où vous faites cela dépend grandement du type d'application que vous créez. En termes très généraux, vous configurerez généralement le noyau au niveau du point d'entrée logique ou de la section "démarrage" de votre code. S'il s'agissait d'une console ou d'une application de bureau Windows, ce serait probablement l'une des premières choses que fait la fonction main().

Le code aimerait ceci:

var modules = new IModule[] { 
           new BarModule() 
          }; 

var kernel = new StandardKernel(modules); 

A ce moment, quand vous faites quelque chose comme ceci:

var barObj = kernel.Get<IBar>() 

La barObj variables fait référence à une instance de BarClass. Tout cela dit, je pourrais très bien ne pas avoir une compréhension complète de toutes les nuances de votre application - par exemple. les assemblages sont chargés dynamiquement, etc. J'espère que cela aide de toute façon.

+0

Un peu en retard à la fête, mais c'est une réponse très solide, merci Peter. –