StructureMap Условное использование - PullRequest
3 голосов
/ 19 октября 2010

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

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

Тестовое предложение будет иметь WebCache в другом случае SystemCache ???

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

Ответы [ 2 ]

6 голосов
/ 23 октября 2010

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

For<ICacheStorage>().Use<NullObjectCache>();
For<Test>().Use<Test>.Ctor<ICacheStorage>().Is<HttpContextCacheAdapter>();
For<Test2>().Use<Test2>.Ctor<ICacheStorage>().Is<HttpContextCacheAdapter>();
2 голосов
/ 19 октября 2010

Спасибо, я нашел решение, если кто-то из вас уже слышал (я что-то изменил в состоянии и работает):

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

                                                                });

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

...