我试图在带有装饰器链的StructureMap 3中创建一个依赖图:

每个实例都有一个构造函数,该构造函数具有多种相似性,但是内部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)


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

最佳答案

DecorateAllWith默认情况下允许自动装配,并允许以非常简单的方式堆叠装饰器:

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

10-06 00:54