StructureMap有条件的使用

时间:2010-10-19 06:48:15

标签: c# .net 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&LT;'ITEST&GT;()

Test Clase将在其他情况下使用WebCache SystemCache ???

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:6)

我认为你应该避免使用if的条件构造语法 - 如果有更简单的替代方法。在你的情况下,我认为这样做:

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

答案 1 :(得分:2)

谢谢我确实找到了解决方案,如果你们其中一个人听到的是它(我确实改变了一些条件并正在工作):

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

                                                                });

抱歉我的英文不好