2010-07-28 6 views
2

J'utilise StructureMap 2.6.1
Ceci est le code de Bootstrapper.cs:StructureMap 2.6.1 bootstrapper

ObjectFactory.Initialize(x => x.For<IFoo>().Use<Foo>()); 

Quand je lance l'application, je reçois l'exception suivante:

Aucune instance par défaut défini pour PluginFamily IFoo, version = 1.0.0.0, Culture = neutral , PublicKeyToken = null

Je ne suis pas une exception lorsque j'utilise ce code obsolète:

ForRequestedType<IFoo>() 
       .TheDefault.Is.OfConcreteType<Foo>(); 

Quelqu'un peut-il me dire la dernière syntaxe pour la initialiseur de ObjectFactory?
Merci.

Répondre

3

Chaque fois que vous appelez Initialize, vous réinitialisez ObjectFactory. C'est à dire. dans le scénario suivant:

ObjectFactory.Initialize(x => x.For<IFoo>().Use<Foo>()); 
ObjectFactory.Initialize(x => x.For<IBaz>().Use<Baz>()); 

Vous avez seulement fait cartographié IBaz à Baz.

Vous devez utiliser un ApplicationRegistry à la place:

public class ApplicationRegistry : Registry 
{ 
    public ApplicationRegistry() 
    { 
     For<IFoo>().Use<Foo>(); 
     For<IBaz>().Use<Baz>(); 
    } 
} 

et l'utiliser dans votre méthode Initialize:

ObjectFactory.Initialize(x => x.AddRegistry(new ApplicationRegistry())); 
+0

Je peux mapper de nombreux articles si je les séparer par le coma. Le problème est que ObjectFactorz.Initiaze ne fonctionne pas dans la classe ApplicationRegistry. Pouvez-vous me dire comment passer l'argument au constructeur? Je veux le coder en dur. La syntaxe obsolète était WithCtorArg ("comeValue"). EqualTo ("someValue") –

+0

Passer un argument à quel constructeur? – GenericTypeTea

+0

Toute classe. Pour () .Utilisez () .WithCtorArg ("someValue"). EqualTo ("someValue"); –