2010-01-31 3 views
1

Je viens de mettre à jour la dernière version de structemap dll et maintenant mon site ne fonctionne plus au runtime en raison de méthodes obsolètes dans structuremap, donc j'essaye de mettre à jour mon code bootstrapper.Syntaxe du structuremap dans la version 2.5.4

Dans ma classe bootstrapper j'ai réécrite à:

public class Bootstrapper 
{ 
    public static void ConfigureStructureMap() 
    { 
     ObjectFactory.Initialize(InitializeStructureMap); 
    } 

    private static void InitializeStructureMap(IInitializationExpression x) 
    { 
     x.AddRegistry(new DatabaseServiceRegistry());       
     x.For<IArticleService>().Use<ArticleService>(); 
     x.For<IArticleRepository>().Use<SqlArticleRepository>(); 
    } 
} 

J'ai ajouté la ligne de Registre que j'utilise LINQ to SQL qui est dans un projet séparé.

Ceci est le code qui a travaillé dans l'ancienne version de StructureMap:

public class DatabaseServiceRegistry : Registry 
{ 
    public override void ConfigureStructureMap() 
    { 
     ForRequestedType<Database>() 
     .TheDefaultIs(() => new Database(Settings.Default.server)) 
     .CacheBy(InstanceScope.Hybrid);     
    } 

Je pense que je dois réécrire quelque chose comme ça?

public void ConfigureStructureMap() 
{ 
    ObjectFactory.Configure(x => 
    {     
     For<Database>().Use(new Database(Settings.Default.server));     
    }); 
} 

Cette compile mais je reçois une erreur d'exécution de:

StructureMap Code d'exception: 202 Aucune instance par défaut défini pour PluginFamily MyProject.Data.SqlRepository.Database

Qu'est-ce que je fais mal ? Je trouve qu'il est difficile de trouver la documentation qui se rapporte à la dernière syntaxe et non référencement méthodes dépréciées :(

Répondre

2

Vous êtes presque tout à fait avec votre nouvelle syntaxe 2.5.4 Il vous manque juste la configuration hybride J'ai essayé de reproduire votre problème et je ne pouvais pas (en utilisant le tronc ou la version 2.5.4) Voici mon test réussi

public class DatabaseServiceRegistry : Registry 
{ 
    public const string DefaultSettings = "my settings"; 

    public DatabaseServiceRegistry() 
    { 
     For<Database>().HybridHttpOrThreadLocalScoped().Use(new Database(DefaultSettings)); 
    } 
} 

public class Database 
{ 
    public string Settings { get; set; } 

    public Database(string settings) 
    { 
     Settings = settings; 
    } 
} 

[TestFixture] 
public class Structure_map_configuration 
{ 
    [Test] 
    public void TEST() 
    { 
     ObjectFactory.Initialize(cfg => 
     { 
      cfg.AddRegistry<DatabaseServiceRegistry>(); 
     }); 

     ObjectFactory.GetInstance<Database>().Settings.ShouldEqual(DatabaseServiceRegistry.DefaultSettings); 
    } 
} 

Est-il possible que vous ayez deux classes nommées 'Base de données' et que vous configuriez l'une d'entre elles dans votre registre et une autre dans votre emplacement de service?

+0

Merci qui l'a fixé, il pourrait vraiment faire avec plus de documentation! : D – KevinUK

+0

Je suis d'accord que les fonctionnalités 2.5.4 ne sont pas encore bien documentées. Jeremy le sait et a mentionné sur Twitter que c'est son prochain objectif. – KevM

+0

Oups j'ai menti il ​​en a effectivement parlé sur le groupe Google de StructureMap. http://groups.google.com/group/structuremap-users/browse_thread/thread/ac934bc9d758b796/e01cf7c7c253ea81?lnk=gst&q=2.5.5#e01cf7c7c253ea81 – KevM

1

Utilisez ObjectFactory.Initialize à la place si configure:.

ObjectFactory.Initialize(x => 
     { 


      x 
       .For<IProductsRepository>() 
       .LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.PerRequest)) 
       .Use<SqlProductsRepository>() 
       .Ctor<string>("connectionString") 
       .Is(@"Data Source=.\sqlexpress2008;Initial Catalog=SportsStore;Persist Security Info=True;User ID=xxxxx;Password=xxxxxxx"); 


     }); 

Hope this helps

+0

Les deux façons de le faire, soit par l'intermédiaire d'un registre ou d'un initilize. Il est préférable d'avoir un serviceregiatry – Thanigainathan

Questions connexes