Structuremap 3多重装饰

时间:2014-12-22 10:35:56

标签: c# structuremap structuremap3

我正在尝试使用一系列装饰器在StructureMap 3中创建一个依赖图:

每个实例都有一个带有多个arugments的构造函数,但只有一个内部IGeocoder的参数,例如

public SomeCachingGeocoder(IGeoCoder inner, IFoo somethingElse)

我这样挂了他们:

For<OviGeoCoder>().Use<OviGeoCoder>();
For<SqlCachingGeocoder>().Use<SqlCachingGeocoder>().Ctor<IGeoCoder>().Is<OviGeoCoder>();
For<RedisCachingGeocoder>().Use<RedisCachingGeocoder>().Ctor<IGeoCoder>().Is<SqlCachingGeocoder>();
For<IGeoCoder>().Use<RedisCachingGeocoder>();

但是我得到了

  

检测到双向依赖关系!检查下面的StructureMap堆栈跟踪:
  1.)SOAM.Services.IGeoCoder(SOAM.Services.Geocoding.RedisCachingGeocoder)的实例
  2.)新的RedisCachingGeocoder( IDatabase的默认值 IGeoCoder的默认值
  3.)SOAM.Services.Geocoding.RedisCachingGeocoder
  4.)SOAM.Services.IGeoCoder(SOAM.Services.Geocoding.RedisCachingGeocoder)的实例
  5.)新的HomeController( IGeoCoder的默认值 IAlertService的默认值
  6.)SOAM.Web.Controllers.HomeController
  7.)SOAM.Web.Controllers.HomeController的实例   8.)Container.GetInstance(SOAM.Web.Controllers.HomeController)

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

DecorateAllWith默认允许自动连接,并允许以非常简单的方式堆叠装饰器:

For<IGeoCoder>().Use<OviGeoCoder>();
For(typeof(IGeoCoder)).DecorateAllWith(typeof(SqlCachingGeocoder));
For(typeof(IGeoCoder)).DecorateAllWith(typeof(RedisCachingGeocoder));

答案 1 :(得分:2)

如果由于某种原因你无法使用 DecorateAllWith()那么这应该可行:

        var container = new Container(
            c =>
                {
                    c.For<IFoo>().Use<Foo>();
                    c.For<IGeoCoder>().Add<OviGeoCoder>().Named("default");
                    c.For<IGeoCoder>()
                        .Add<SqlCachingGeocoder>()
                        .Ctor<IGeoCoder>()
                        .Is(ctx => ctx.GetInstance<IGeoCoder>("default"))
                        .Named("SqlCaching");
                    c.For<IGeoCoder>()
                        .Use<RedisCachingGeocoder>()
                        .Ctor<IGeoCoder>()
                        .Is(ctx => ctx.GetInstance<IGeoCoder>("SqlCaching"));
                });

在使用使用 vs 添加时,想知道区别的是什么? Take a look here