2010-10-19 10 views
3

Je dois me battre toute la journée et je ne peux trouver aucune solution à mon problème. Entendre est mon problème: Je HAWE deux classes qui mettent en œuvre une interfaceStructureMap Utilisation conditionnelle

public interface ICacheObject 
{ 
    string Get(); 
} 

public class WebCacheObject : ICacheObject 
{ 
    public string Get() 
    { 
     return "Web"; 
    } 
} 

public class SysteCacheObject : ICacheObject 
{ 
    public string Get() 
    { 
     return "System"; 
    } 
} 

Ainsi, dans un autre clase Par exemple, en classe Test I Nead pour injecter le WebCacheObject et Test2 clase i Nead d'injecter SystemCacheObject. Je l'ai fait en Initialiser:

  ObjectFactory.Initialize(c =>{ c.For<IMessage>().Use<Message>(); 
             c.For<ICacheObject>().ConditionallyUse(t =>{t.If(g => g.RequestedName == "HTTP") 
                          .ThenIt.Is.ConstructedBy(
                           () => 
                           new WebCacheObject()); 

                         t.If(g =>g.RequestedName =="OtherCache") 
                          .ThenIt.Is.ConstructedBy(
                           () => 
                           new SysteCacheObject 
                            ()); 
                        }); 

Mais je ne sais pas comment appeler Test-s clase-s donc si je l'appelle si la condition est vraie (ou comment changer condition pour que cela fonctionne)

ObjectFactory.GetInstance < « ITest>()

le test Clase sera hawe WebCache dans d'autres cas SystemCache ???

Désolé pour mon mauvais anglais.

Répondre

6

Je pense vous devriez éviter la syntaxe de construction conditionnelle avec if - s'il y a une alternative plus simple. Dans votre cas, je pense que cela va faire:

For<ICacheStorage>().Use<NullObjectCache>(); 
For<Test>().Use<Test>.Ctor<ICacheStorage>().Is<HttpContextCacheAdapter>(); 
For<Test2>().Use<Test2>.Ctor<ICacheStorage>().Is<HttpContextCacheAdapter>(); 
2

Merci je l'ai fait trouver la solution si eny de vous neade entendre est (je l'ai fait changer quelque chose en état et travaille):

x.For<ICacheStorage>().ConditionallyUse(c => 
                   { 
                    c.If(t => t.ParentType == typeof(Test) || 
                     t.ParentType == typeof(Test2)) 
                     .ThenIt 
                     .Is.ConstructedBy(
                      by => new HttpContextCacheAdapter()); 

                    c.TheDefault.Is.ConstructedBy(
                      by => new NullObjectCache()); 

                   }); 

Désolé pour mon mauvais anglais

+0

La solution @PHeiberg est tellement plus propre que cela! – Sadegh