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

                                                                });

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

Другие вопросы по тегам