2

デコレーターのチェーンを使用して、StructureMap 3 で依存関係グラフを作成しようとしています。

各インスタンスには複数の引数を持つコンストラクターがありますが、内部の IGeocoder の引数は 1 つだけです。

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.) new HomeController( IGeoCoder のデフォルト、 IAlertServiceデフォルト)
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 に答える