0

依存性注入は初めてで、問題を解決しようとしています。私は2つのサービスを持っています。これらの各サービスには、相互に必要なメソッドがあります。

たとえばSiteManager、 my が必要なメソッドを持っていますForumManager。私ForumManagerには私の必要なメソッドがありますSiteManager

私は次の2つのクラスを持っています:

public class SiteManager:ISiteManager
{
    public IForumManager ForumManager { get; set; }

    public SiteManager()
    {
        this.ForumManager = new ForumManager();
    }
}

public class ForumManager:IForumManager
{
    public ISiteManager SiteManager { get; set; }

    public ForumManager()
    {
        this.SiteManager = new SiteManager();
    }
}

非常に明らかに、これはスタック オーバーフロー例外を引き起こします。ここで多くの投稿を読みましたが、これを解決する方法についての小さなヒントが必要だと思います. 独自のアセンブリにインターフェイスがあります。

依存関係を独自のプロパティに入れて、使用すると作成されるようにすることを考えました。しかし、これはベストプラクティスでしょうか?

私は IoC コンテナーを使用していません (これまで使用したことがありません)。

この特定の問題を「ベストプラクティス」の方法で解決する方法についてのヒント! :-)

4

5 に答える 5

0

あなたがしていることとあなたが提案していることの両方がスタックオーバーフロー例外を引き起こします。なぜあなたがそのようなことをしたいのかわかりません。あなたはそれについて何のヒントも与えていませんが、マネージャー、おそらくシングルトン、おそらく静的メソッドを使用して作成することを提案できると思います。

public static void DoStuff(ISiteManager sm, IForumManager fm)
{
  // your code here can use the best of both without SO
}

と保持ISiteManagerForumManagerIForumManagerいないSiteManager

于 2013-08-29T08:05:47.990 に答える
0

winforms と AutoFac で MVP を使用している場合、プレゼンターを参照するビューとビューを参照するプレゼンターでまったく同じ問題が発生しました。私がそれを回避した方法は、Initialize メソッドを使用して、クラスの 1 つを別のクラスに渡すことです。これがベストプラクティスかどうかはわかりませんが、以前に提案されたのを見たことがあります(mvp に関するこの質問

実装の詳細については、次のとおりです。

public class SiteManager:ISiteManager
{
    public IForumManager ForumManager { get; set; }

    public SiteManager()
    {

    }

    public Initialize(IForumManager forumManager)
    {
        ForumManager = forumManager
    }
}

public class ForumManager:IForumManager
{
    public ISiteManager SiteManager { get; set; }

    public ForumManager(ISiteManager siteManager)
    {
        this.SiteManager = new SiteManager();
        this.SiteManager.Initialize(this);
    }
}

編集実際には、投稿された他のソリューションとおそらく一致するでしょう。私はこれを純粋に循環依存関係の観点から見ていました

于 2013-08-29T08:13:40.027 に答える
0

循環依存は絶対に避けるべきです。つまり、A は B に依存し、B は A に依存しています。

contextこれは、依存関係の癌のようなものです。java のバージョンとは異なり、この種の依存関係が検出された場合、障害のあるシステムに切り替えることができない spring.net フレームワークを使用しました。これにより、春のログの検索と分析に何時間もの混乱が生じるだけであると言わざるを得ません。

ほぼ 200 を問題なく定義しましたが、別の BeanLazy参照を追加すると失敗しました。これを回避するためにソリューションを解きほぐすことはほとんど不可能です。

于 2013-08-29T13:55:22.307 に答える
0

相互に依存するクラスを持つことは明らかにできません。あなたがする必要があるのは、別のクラスを作成し、フォーラムマネージャーとサイトマネージャーを同時に使用するメソッドをそこに移動することです: これはサンプルの3番目のクラスです:

class ForumAndSiteManager
{
     public ForumAndSiteManager(ISiteManager siteMaanger, IForumManager forumManager)
     {
         //save the injected object to private fileds
     }

     //define methods which will use both sitemanager and forum manager
}

このようにして、循環依存を解消します

于 2013-08-29T08:09:10.900 に答える