两个服务相互依赖(stackoverflow异常)-如何解决?

Lar*_*ard 5 c# design-patterns dependency-injection

我是依赖注入的新手,我正在尝试解决一个问题。我有两项服务。这些服务中的每一个都有需要彼此的方法。

例如:SiteManager在需要我的ForumManager. 我ForumManager有需要我的方法SiteManager

我有以下两个课程

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

很明显,这将导致堆栈溢出异常,因为它们互相调用。我在这里阅读了很多帖子,我想我只需要一些关于如何解决这个问题的小提示。我的接口在他们自己的程序集中。

我考虑过将依赖项放入它们自己的属性中,这样当它们被使用时,它们就被创建了。然而,这是最佳实践吗?

我不使用 IoC 容器(而且我以前没有使用过)。

有关如何以“最佳实践”方式解决此特定问题的任何提示!:-)

Ian*_*cer 7

你不应该在你的类中调用 new ,这会使它们紧密耦合。允许您使用模拟单独测试每个类的 IOC 正确模式是:-

public class SiteManager:ISiteManager
{
    private readonly IForumManager forumManager;

    public SiteManager(IForumManager forumManager)
    {
        this.forumManager = forumManager;
    }
}

public class ForumManager:IForumManager
{
   private readonly ISiteManager siteManager;

   public ForumManager(ISiteManager siteManager)
   {
      this.siteManager = siteManager;
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,这并不能解决相互递归的问题。解决这个问题的最简单方法是不对其中一个类使用构造函数注入,而是使用属性注入,即将 SiteManager 放回 ForumManager 上的公共属性,并在创建这两个对象后对其进行设置。

然后您的设置代码会执行以下操作:-

     IForumManager forumManager = new ForumManager();
     ISiteManager siteManager = new SiteManager(forumManager);
     forumManager.SiteManager = siteManager;
Run Code Online (Sandbox Code Playgroud)

另一种选择是将 ForumManagerFactory 传递到 SiteManager 中,例如Func<ISiteManager,IForumManager>.

     ISiteManager siteManager = new SiteManager((s) => new ForumManager(s));
Run Code Online (Sandbox Code Playgroud)

然后,您可以在站点管理器内调用 Func,传递this以获取 IForumManager。ForumManager 获取 SiteManager 的实例,并且 SiteManager 具有 ForumManager 对象。