我正在尝试使用一系列装饰器在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)
任何想法如何解决这个问题?
答案 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