StructureMap Условное использование
Я весь день бился головой, и я не могу найти решение моего дела, поэтому мне нужна помощь. Слушай, это моя проблема: у меня есть два класса, которые реализуют один интерфейс
public interface ICacheObject
{
string Get();
}
public class WebCacheObject : ICacheObject
{
public string Get()
{
return "Web";
}
}
public class SysteCacheObject : ICacheObject
{
public string Get()
{
return "System";
}
}
Таким образом, в каком-то другом предложении "Например, в тесте класса" мне необходимо ввести WebCacheObject, а в предложении "Test2" мне необходимо ввести 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>()
Test Clase будет иметь WebCache в другом случае SystemCache???
Извините за мой плохой английский.
2 ответа
Я думаю, что вы должны избегать условного синтаксиса конструкции с if - если есть более простая альтернатива. В вашем случае я думаю, что это будет делать:
For<ICacheStorage>().Use<NullObjectCache>();
For<Test>().Use<Test>.Ctor<ICacheStorage>().Is<HttpContextCacheAdapter>();
For<Test2>().Use<Test2>.Ctor<ICacheStorage>().Is<HttpContextCacheAdapter>();
Спасибо, я нашел решение, если кто-то из вас уже слышал (я изменил что-то в состоянии и работает):
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());
});
Извините за мой плохой английский