我试图在带有装饰器链的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));