2

我正在尝试使用装饰器链在 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.) new RedisCachingGeocoder( IDatabase的默认值,IGeoCoder的默认值)
3.) SOAM.Services.Geocoding.RedisCachingGeocoder
4 .) SOAM.Services.IGeoCoder 的实例 (SOAM.Services.Geocoding.RedisCachingGeocoder)
5.) new HomeController( IGeoCoder 的默认值,IAalertService默认值)
6.) SOAM.Web.Controllers.HomeController
7.) SOAM.Web 的实例.Controllers.HomeController
8.) Container.GetInstance(SOAM.Web.Controllers.HomeController)

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

4

2 回答 2

4

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

For<IGeoCoder>().Use<OviGeoCoder>();
For(typeof(IGeoCoder)).DecorateAllWith(typeof(SqlCachingGeocoder));
For(typeof(IGeoCoder)).DecorateAllWith(typeof(RedisCachingGeocoder));
于 2014-12-22T21:56:39.310 回答
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"));
                });

想知道使用UseAdd有什么区别吗?看看这里

于 2014-12-22T23:20:22.860 回答