2010-10-19 2 views
3

Я весь день борюсь за голову, и я не могу найти решение для своего дела, поэтому я не помогу. Слышать это моя проблема: я Hawe два класса, которые реализуют один интерфейсStructureMap Условное использование

public interface ICacheObject 
{ 
    string Get(); 
} 

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

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

Так что в каком-то другом Clase Для примера в тестовом классе я СВАО впрыснуть WebCacheObject и test2 Clase я СВАО впрыснуть SystemCacheObject. Я сделал это в Initialize:

  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 
                            ()); 
                        }); 

Но я не знаю, как назвать Test-s Clase-s, так что если я называю так условие истинно (или как изменить состояние, так что это будет работать)

< ObjectFactory.GetInstance «ITest>()

Тест Clase будет Hawe Webcache в другом случае SystemCache ???

Извините за мой плохой английский.

ответ

6

Я думаю, вам следует избегать синтаксиса условного построения с if - если есть более простая альтернатива. В вашем случае я думаю, что это будет делать:

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

Благодаря я нашел решение, если Eny один из вас neade слышит, это (я сделал изменить некоторые вещи в состоянии и работаю):

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()); 

                   }); 

Извините за мой плохой английский

+0

@PHeiberg решение настолько чище, чем это! – Sadegh

Смежные вопросы